2015-05-13 116 views
0

我正尝试用新名称更新我的用户会话,这是我认为的一项简单任务。护照更新会话不会持续

我是一个登录的用户,并创下了“更新”路线,我定义我自己的中间件来更新会话:

module.exports = function(req, res, next) { 
    console.log(req.user); 
    req.login(req.body.user, function(err) { 
     if (err) return next(new Error('Error updating user profile')); 
     console.log('USER UPDATED *******', req.user); 
     next(); 
    }); 
}; 

花了一些时间来挖掘出上述代码应该简单地更新Passport会话对象。它正确地记录了先前的会话,然后是更新的会话,但是当我在初始响应后导航到新页面时,用户对象完全丢失并返回{}。

任何想法?

source

+0

@laggingreflex这可能是什么。我只传递我想要在req.body.user中更新的字段。据我了解它是如何工作的...我会尝试合并新的旧的并将其传入。 – sidonaldson

+0

@laggingreflex工作。你能否将你的评论复制到答案中,我会奖励这些观点 – sidonaldson

回答

1

要登录用户,并坚持它变成会议护照采用了serialize功能它们通常存储user.id作为cookie和deserialize功能,检索该cookie并做了User.findById数据库调用找到相关用户,如果找到一个,那就是存储在req.user中的用户对象。

req.login将任何您将它作为第一个参数直接传递给passport.serialize,否则它通常来自一个策略,它本身会从数据库调用中检索用户对象,或者创建一个。

因此,当您使用req.login时,您需要将passport.serialize实际上会收到的用户对象传递给它,以便它可以将id存储在cookie中。

在你的情况,你在做req.login(req.body.user, ...,自req.body.user来自POST表单变量一定不能有idpassport.serialize会一直保存在cookie中。

而应该从req.body.user使用新的价值观和更新req.user本身,然后做req.login(req.user, ...

var _ = require('lodash'); 
module.exports = function(req, res, next) { 

    //using lodash merge the updated user into the cached user 
    _.merge(req.user, req.body.user); 

    req.login(req.user, function(err) { 
     if (err) return next(new Error('Error updating user profile')); 
     console.log('USER UPDATED *******', req.user); 
     next(); 
    }); 
};