在与 PassportJS 的会话中修改 user.username



>我有一个表格,允许人们更新他们的个人资料信息,其中填充了通过PassportJSreq.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将其加载到会话中,如下所示:

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

有谁知道如何解决这个问题,或者这是护照的一个棘手问题?

我拥有的进行更新的代码通常如下所示:

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

更新:

根据注释请求,来自serializeUserfindOne的错误消息在调用时null,因此问题不是查询。

由于username是可变值,因此不应将其用作会话cookie密钥。

我强烈建议改用user._id,因为它是不变的值,这样即使用户名已更改,服务器仍然"知道"当前用户。查看官方http://passportjs.org/docs,他们也使用id作为会话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'));
}
});

请在护照上更新您的代码 反序列化功能.您未选中,用户是否有空。因此,当没有用户找到时,您遇到了该错误>

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

最新更新