6

我目前正忙着在 MongoDb 中存储会话。

我尝试过 express-session-mongo 和 connect-mongodb,当我尝试加载登录页面时,它们都给了我相同的“500 内部服务器错误”。这让我认为可能在某个地方与 mongoose-auth 存在冲突。

无论如何,这是我的设置:

应用程序.js:

var MongoStore = require('connect-mongodb');
var MongoDb = require('mongodb').Db;
var Server = require('mongodb').Server;

var db = new MongoDb('myDb', new Server('localhost', 27017, {auto_reconnect: true, native_parser: false}));

app.configure(function() {
  app.use(express.logger({format: 'dev'}));
  app.set('views', __dirname + '/../views');
  app.set('view engine', 'jade');
  app.set('view options', { layout: false });
  app.use(express.bodyParser());
  app.use(express.cookieParser());
  app.use(mongooseAuth.middleware());
  app.use(require('./mysite').middleware());
  app.use(express.methodOverride());
});


app.configure('production', function(){
  var oneWeek = 657450000;
  app.use(express.static(__dirname + '/../public', { maxAge: oneWeek }));
  app.use(express.session({ store: new MongoStore({db: db}), secret: 'super secret' }));
  app.use(express.errorHandler());
});

// Routes
require('./routing.js');

mongooseAuth.helpExpress(app);

app.listen(3000);
console.log('Express server listening on port %d in %s mode', app.address().port, app.settings.env);

用户模型.js

var Schema = mongoose.Schema;
var mongooseTypes = require("mongoose-types");
var mongooseAuth = require('mongoose-auth');
mongooseTypes.loadTypes(mongoose);

var everyauth = require('everyauth')
everyauth.debug = true;

var UserSchema = new Schema({any: {}});

UserSchema.plugin(mongooseAuth, {
    everymodule: {
      everyauth: {
          User: function () {
            return User;
          }
      }
    }
    , password: {
      loginWith: 'email'
      , extraParams: {
            phone: String
          , username: String
        }
      , everyauth: {
            getLoginPath: '/login'
          , postLoginPath: '/login'
          , loginView: 'account/login.jade'
          , getRegisterPath: '/register'
          , postRegisterPath: '/register'
          , registerView: 'account/register.jade'
          , loginSuccessRedirect: '/login/success'
          , registerSuccessRedirect: '/register/success'
        }
    }
});

mongoose.model('User', UserSchema);
User = mongoose.model('User');

此时此刻,我真的只是想将 MongoDb 用作会话存储,但是当我尝试加载登录页面时,在 node.js 控制台中再次出现 500 错误/没有任何信息。

任何帮助将不胜感激。

谢谢

4

2 回答 2

10

它最终成为各种模块的问题:connect-session-mongo / express-session-mongo / connect-mongo,使用connect 2.0.1和Express使用connect 1.8.5。

显然,这里的依赖冲突阻止了会话存储模块访问“req.secret”属性。

为了让它工作,我结束了使用仍然使用连接 1.8.5 的模块 connect-mongodb,就像 Express 一样。

我之前无法使 connect-mongodb 工作的原因是用户错误,我太努力地使用在线示例中的复制/粘贴而不是我的头脑。

这是最终使用 connect-mongodb 为我工作的配置代码:

var Session = require('connect-mongodb');

app.configure('production', function(){
  var oneWeek = 657450000;
  app.use(express.static(__dirname + '/../public', { maxAge: oneWeek }));

  var session = express.session({
        store: new Session({
              url: 'mongodb://localhost:27017/test', 
              maxAge: 300000
        }),
        secret: 'superTopSecret' 
  });
  app.use(session);

  app.use(mongooseAuth.middleware());
  app.use(require('./mySite').middleware());
  app.use(express.methodOverride());
  app.use(express.errorHandler());  
});

希望这对遇到此问题的其他人有所帮助。如果您对此解决方案有任何建议/改进,我很高兴听到。:)

于 2012-03-02T20:38:16.540 回答
1
const express = require('express')
const app = express()
const cookieParser = require('cookie-parser');
const session = require('express-session')
const mongoose = require('mongoose');
const MongoStore = require('connect-mongo')(session);

mongoose.connect('mongodb://localhost/my-database', {
    useMongoClient: true
});
mongoose.Promise = global.Promise;
const db = mongoose.connection

app.use(cookieParser());
app.use(session({
    secret: 'my-secret',
    resave: false,
    saveUninitialized: true,
    store: new MongoStore({ mongooseConnection: db })
}));
于 2021-03-22T18:14:42.747 回答