【发布时间】:2025-11-26 12:50:01
【问题描述】:
我是 Node 新手,我正在构建一个单页 Web 应用程序。我正在使用 Express 和 Mongoose,尝试设置像 these docs. 这样的登录调用。我可能完全搞错了,所以很抱歉。
首先,我正在收听登录帖子。这是我想根据响应是否经过身份验证向响应添加自定义数据的地方。 The documentation 我提到了 res 作为参数传入,但我看不到访问它的方法。另外,第一个参数应该是“err”(通常为空)吗?我的承诺中的.catch 语句需要调用done(),否则请求不会完成。
app.post('/login',passport.authenticate('local-signin',
function(req, res) {
// wasn't sure what I should be doing here
}
));
护照设置:
passport.use('local-signin', new LocalStrategy(
{passReqToCallback : true},
function(req, username, password, done) {
funct.localAuth(username, password)
.then(function (user) {
if (user) {
console.log("LOGGED IN AS: " + user.username);
done(null, user);
}
if (!user) {
done(null, false);
}
})
.catch(function (err){
console.error(err.message);
done(err);
});
}
));
以及身份验证处理程序:
exports.localAuth = function (username, password) {
return db.User.findOne({ username: username }).exec()
.then(function (result){
if(result){
var hash = result._doc.passwordHash;
if(!hash){
console.warn("User " + username + " has no password set");
return null;
}
console.log(bcrypt.compareSync(password, hash));
if (bcrypt.compareSync(password, hash)) {
return result;
} else {
return null;
}
} else {
return null;
}
},
function(reason){
console.error("Failed to login: " + reason);
}
);
};
【问题讨论】:
-
打印什么:
console.log("LOGGED IN AS: " + user.username);?你还说// res isn't res! res is the。 Res 是什么? -
这一行看起来是你的问题:
return db.User.findOne({ username: username }).exec()这不会返回你认为它所做的,因为findOne返回一个承诺,一旦它被执行,节点就已经开始下一个工作并且在下一个事件循环(下一个滴答声)之前,不会回来查看该承诺已解决的问题。
标签: node.js express passport.js passport-local