Javascript 护照没有';t将子文档保存到req.user
passport.jsJavascript 护照没有';t将子文档保存到req.user,javascript,node.js,passport.js,passport-local,Javascript,Node.js,Passport.js,Passport Local,passport.js passport.serializeUser(function(user, done) { done(null, user._id); }); passport.deserializeUser(function(id, done) { User .findById(id).exec() .then(function(user) { done(null, user); }, done) ; }); passport.use(
passport.serializeUser(function(user, done) {
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
User
.findById(id).exec()
.then(function(user) {
done(null, user);
}, done)
;
});
passport.use(new LocalStrategy(function(username, password, done) {
Local
.findOne({ username: username })
.select('username role hashedPassword')
.exec()
.then(function(local) {
if (!local) {
return done(null, false);
}
var validPassword = bcrypt.compareSync(password, local.hashedPassword);
if (!validPassword) {
return done(null, false);
}
else {
User
.findOne({ local: local })
.populate('local')
.exec()
.then(function(user) {
console.log('user: ', user); // has subdocument
return done(null, user);
})
;
}
})
;
}));
router.get('/current-user', Auth.isLoggedIn, function(req, res) {
console.log('req.user: ', req.user); // doesn't have subdocument
res.status(200).json(req.user);
});
auth.routes.js
passport.serializeUser(function(user, done) {
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
User
.findById(id).exec()
.then(function(user) {
done(null, user);
}, done)
;
});
passport.use(new LocalStrategy(function(username, password, done) {
Local
.findOne({ username: username })
.select('username role hashedPassword')
.exec()
.then(function(local) {
if (!local) {
return done(null, false);
}
var validPassword = bcrypt.compareSync(password, local.hashedPassword);
if (!validPassword) {
return done(null, false);
}
else {
User
.findOne({ local: local })
.populate('local')
.exec()
.then(function(user) {
console.log('user: ', user); // has subdocument
return done(null, user);
})
;
}
})
;
}));
router.get('/current-user', Auth.isLoggedIn, function(req, res) {
console.log('req.user: ', req.user); // doesn't have subdocument
res.status(200).json(req.user);
});
输出
user: { _id: 55d8c6f7e1092f25bb761690,
local:
{ _id: 55d8c6f7e1092f25bb76168f,
username: 'a',
role: 'user',
__v: 0 },
__v: 0 }
✓ Can log in with valid credentials
req.user: { _id: 55d8c6f7e1092f25bb761690,
local: 55d8c6f7e1092f25bb76168f,
__v: 0 }
当我将用户保存到req.user
(在passport.js
中)时,它有子文档local
。但是当我稍后尝试访问req.user
时,它会给我ObjectId
,而不是子文档
为什么会这样?如何获取子文档而不是
ObjectId
?这大致就是Passport的工作原理:
- 当用户尚未登录时调用该策略;如果登录被接受,则传递给回调的用户将被传递给
,以存储(部分)在会话存储中。在您的情况下,您将用户serializeUser()
存储在会话存储中李>\u id
在用户登录时调用(换句话说,当存在有效会话时)。会话值(反序列化用户()
)被传递给它,传递给回调的值被存储为\u id
req.user
因此,您也需要从
反序列化用户()
中填充本地
,否则它在req.user
中不可用。您是如何实现反序列化用户()
?@robertklep我用代码更新了我的问题。将populate('local')
添加到反序列化用户()
修复了它。谢谢你能把它写下来作为答案吗?