2012-06-12 8 views
8

Utilizando Mongoose.js, mi método de autenticación rellena el campo "companyRoles._company", pero los datos poblados vuelven a la ID de referencia de la compañía cuando Intento acceder al mismo campo poblado en mi objeto req.user.Passport.js y Mongoose.js populate User on login - pierde el campo poblado en req.user

//Authentication 
UserSchema.static('authenticate', function(email, password, callback) { 
    this.findOne({ email: email }) 
    .populate('companyRoles._company', ['name', '_id']) 
    .run(function(err, user) { 
     if (err) { return callback(err); } 
     if (!user) { return callback(null, false); } 
     user.verifyPassword(password, function(err, passwordCorrect) { 
     if (err) { return callback(err); } 
     if (!passwordCorrect) { return callback(null, false); } 
     return callback(null, user); 
     }); 
    }); 
}); 

//login post 
app.post('/passportlogin', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err) } 
    if (!user) { return res.redirect('/passportlogin') } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     console.log('req User'); 
     console.log(req.user); 
     return res.redirect('/companies/' + user.companyRoles[0]._company._id); 
    }); 
    })(req, res, next); 
}); 

app.get('/companies/:cid', function(req, res){ 
    console.log('req.user in companies:cid'); 
    console.log(req.user); 
}); 

Después req.logIn, registrando req.user muestra - companyRoles {_company: [Objeto]}

Pero cuando vuelvo a dirigir a/empresas /: vía ID después de iniciar sesión, se está mostrando la id y no un [objeto] poblado - companyRoles {_company: 4fbe8b2513e90be8280001a5}

¿Alguna idea de por qué el campo no permanece poblado? Gracias.

Respuesta

12

El problema era que no estaba introducido en el campo de la función passport.deserializeUser, aquí es la función de actualización:

//deserialize 
passport.deserializeUser(function(id, done) { 
    User.findById(id) 
    .populate('companyRoles._company', ['name', '_id']) 
    .run(function (err, user) { 
     done(err, user); 
    }); 
}); 
0

Parece que en su res.redirect está tratando de construir una URL concatenando un objeto a una cadena. Dudo que tenga el resultado que desee. ¿Cómo esperas que se vea la URL?

+0

Gracias ebohlman, estás en lo correcto. No actualicé la URL de redireccionamiento desde que no estaba ocupando el objeto _company. Actualicé el código para ahora tener _company._id. –

+0

Aunque, el problema aún persiste. En/companies/{companyId}, req.user.companyRoles [i] ._ company es un ObjectID y no un objeto _company poblado (nombre, id, etc.). Es extraño ya que req.user es un objeto poblado al iniciar sesión en la devolución de llamada req.logIn. –

+0

Creo que necesitas mostrar el código que maneja '/ companies /: companyId'. Recuerde que después de la redirección, el navegador realizará una solicitud completamente nueva y ninguna de las propiedades que configure en su objeto 'req' original estará presente automáticamente en la nueva. – ebohlman

Cuestiones relacionadas