我有一个表单,允许人们更新他们的个人资料信息,其中填充了通过 PassportJS 来自 req.user
的数据。
问题是,每当我更新对应于 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
将其加载到 session 中,如下所示:
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
是可更改的值,因此您不应将其用作 session cookie 键。
我强烈建议使用 user._id
代替,因为它是未更改的值,这样服务器仍然“知道”当前用户即使用户名已更改。查官方http://passportjs.org/docs ,他们还使用 id
作为 session cookie 键。
顺便说一句,即使您使用的是 username
,您也应该对 passport.deserializeUser()
进行 NULL 检查:
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'));
}
});
关于node.js - 使用 PassportJS 在 Session 中修改 user.username,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45446637/