在使用PassportJS的Session中修改user.username

我有一个表单,允许用户更新他们的个人资料信息,这些信息由来自req.user数据通过PassportJS填充。

问题是,每当我更新对应于user.username的值,我得到以下错误信息:

 TypeError: Cannot read property '_id' of null 

从这段代码的第6行:

 passport.deserializeUser(function(id, done) { mongo.connect("mongodb://localhost:27017/formulas", function(e, db){ if (e) {return next(e);} var col = db.collection("users"); col.findOne({"username": id}, function(err, user){ done(err, {"id": user._id, "username": id, "activeEmail": user.activeEmail, "name": user.name, "password": user.password, "formulas": user.formulas}); }); }); }); 

我假设这是因为在serializeUser我使用user.username加载到会话如下所示:

 passport.serializeUser(function(user, done) { done(null, user.username); }); 

有谁知道如何解决这个问题呢,还是Passport难以解决的问题?

我有这样的更新一般的代码如下所示:

 router.post('/update-profile', function(req, res) { var name = req.body.name; var username = req.body.username; var db = req.db.collection('users'); db.updateOne({"username": username}, { $set: { "name": name, "username": username, } }, function(err, r) { assert.equal(null, err); assert.equal(null, r.matchedCount); } }); res.render('profile', { user: req.user }); }); 

更新:

根据每条评论请求,在调用serializeUser时,来自findOne的错误消息为null ,所以不是查询就是问题。

由于username是可更改的值,因此不应将其用作会话Cookie密钥。

我强烈build议使用user._id因为它是不变的值,所以即使用户名已被更改 ,服务器仍然“知道”当前用户。 检查官方http://passportjs.org/docs ,他们也使用id作为会话cookie的关键。

顺便说一句,即使你使用的username ,你应该做NULL检查passport.deserializeUser()

 col.findOne({"username": id}, function(err, user){ if (user) { done(err, {"id": user._id, "username": id, "activeEmail": user.activeEmail, "name": user.name, "password": user.password, "formulas": user.formulas}); } else { done(new Error('User not found')); } }); 

请更新您的护照反序列化function的代码。 你没有检查,用户是否可用。 所以当没有用户发现,你有这个错误>

 passport.deserializeUser(function(id, done) { mongo.connect("mongodb://localhost:27017/formulas", function(e, db){ if (e) {return next(e);} var col = db.collection("users"); col.findOne({"username": id}, function(err, user){ if (err){ done(new Error('No user found on db')); }else if (user){ done(err, {"id": user._id, "username": id, "activeEmail": user.activeEmail, "name": user.name, "password": user.password, "formulas": user.formulas}); }); } }); });