2012-03-01 17 views
5

Actualmente estoy teniendo un infierno de tiempo tratando de almacenar sesiones en MongoDb.NodeJS + Express + Mongo Session storage

He intentado express-session-mongo y connect-mongodb y ambos me dan el mismo "error de servidor interno 500" cuando intento cargar la página de inicio de sesión. Lo que me lleva a pensar que tal vez haya un conflicto con mongoose-auth en alguna parte.

De todos modos aquí es mi configuración:

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'); 

En este momento en el tiempo que realmente estoy tratando para usar MongoDb como el almacén de sesiones, pero de nuevo obtengo un error de 500 sin información en el node.js conso cuando intento cargar la página de inicio de sesión.

Cualquier ayuda sería muy apreciada.

Gracias

+0

En realidad acabo de volver a intentar con express-session-mongo y aunque sigo teniendo el mismo comportamiento (tratando de cargar la página de inicio de sesión falla con un error 500), acabo de registrar MongoDb y la sesión es en realidad allí como se esperaba – Lancelot

+0

FYI, también lo intentó connect-mongo, el mismo resultado ... mongoose-auth no jugando bien? – Lancelot

+0

Después de buscar el código del módulo everyauth, todo lo que pude averiguar fue que el error 500 ocurrió en everyauth/lib/modules/password.js >> línea 47: res.render (view, locals); Desafortunadamente eso no ayuda demasiado desde donde estoy parado ... :( – Lancelot

Respuesta

8

Se terminó siendo un problema de los distintos módulos: conectar-session-mongo/expresar-session-mongo/connect-mongo, utilizando la conexión 2.0.1 y 1.8.5 Express utilizando la conexión.

Aparentemente, el conflicto de dependencia impidió que los módulos del almacén de sesiones accedieran a la propiedad 'req.secret'.

Para que funcione, terminé usando el módulo connect-mongodb que todavía está usando connect 1.8.5, al igual que Express.

La razón por la que antes no podía hacer el trabajo de connect-mongodb era un error del usuario, intenté demasiado usar copiar/pegar de ejemplos en línea en lugar de usar mi cabeza.

Aquí está el código de configuración que terminó trabajando para mí con 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()); 
}); 

Esperanza esto ayuda a cualquier otra persona que se encuentra con este problema. Si tiene alguna sugerencia/mejora en esta solución, me gustaría escucharla. :)

+3

Gracias por esto, me ha ayudado. También pude usar la conexión existente de Mongoose en lugar de especificar la URL. Lo que es especialmente bueno cuando tienes múltiples entornos con instancias DB separadas. Simplemente reemplace el parámetro 'url' con:' db: mongoose.connection.db' – k00k

+0

Solo quiero decir que es genial. – Lazy