NodeJS + Express + Mongo Session storage - PullRequest
5 голосов
/ 02 марта 2012

В настоящее время у меня чертовски много времени пытается сохранить сессии в MongoDb.

Я пробовал express-session-mongo и connect-mongodb, и оба выдают мне ту же самую "500 внутреннюю ошибку сервера", когдаЯ пытаюсь загрузить страницу входа.Это заставляет меня думать, что, может быть, где-то конфликт с mongoose-auth.

В любом случае, вот моя настройка:

app.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);

userModel.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 в качестве хранилища сеансов, но снова получаю ошибку 500 безкогда я пытаюсь загрузить страницу входа, вся информация в консоли node.js.

Любая помощь будет принята с благодарностью.

Спасибо

1 Ответ

8 голосов
/ 03 марта 2012

Это закончилось проблемой различных модулей: connect-session-mongo / express-session-mongo / connect-mongo, использующих connect 2.0.1, и Express, использующих connect 1.8.5.

Видимо,Столкновение зависимостей здесь не позволило модулям хранилища сеансов получить доступ к свойству 'req.secret'.

Чтобы заставить его работать, я прекратил использовать модуль connect-mongodb, который все еще использует connect 1.8.5, точно так же как 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());  
});

Надеюсь, это поможет всем, кто сталкивается с этой проблемой.Если у вас есть предложения по улучшению этого решения, я буду рад его услышать.:)

...