使用以下代码,我无法使用MongoDB数据库进行身份验证,该数据库已经有一个用户架构和与之关联的用户,我想知道如何确保auth返回isAuth?:
exports.auth = function(username, password, session) {
User.findOne({username: username}, function(err, data) {
if (err) {
console.log(err);
}
var isAuth = username === data['username'] & password === data['password'];
if (isAuth) {
session.isAuthenticated = isAuth;
session.user = {username: username};
}
return isAuth;
});
};
答案 0 :(得分:2)
首先,正如其他人已经在评论中指出的那样,如果你不知道自己在做什么,就不应该实现自己的身份验证逻辑。您可以使用Passport。
现在,您提供的代码。这里有几个问题。
首先想到的是你使用:
var isAuth = username === data['username'] & password === data['password'];
而不是:
var isAuth = username === data['username'] && password === data['password'];
但这只是一个错字。现在,更基本的东西。
您无法返回isAuth
变量,因为您要将其返回给谁?如果您认为它会返回exports.auth
的来电者那么您错了 - exports.auth()
会在return isAuth;
运行之前很久就返回。
另外,如果yu用if (err)
检查错误,那么在else
块中将成功运行的代码放在o中,否则它也会在出现错误时运行,其中包含未定义的变量可能会破坏你的程序。
您需要在函数中添加一个附加参数,这是一个回调:
exports.auth = function(username, password, session, callback) {
User.findOne({username: username}, function(err, data) {
if (err) {
console.log(err);
callback(err);
} else {
var isAuth = username === data.username && password === data.password;
if (isAuth) {
session.isAuthenticated = isAuth;
session.user = {username: username};
}
callback(null, isAuth);
}
});
};
或从exports.auth
函数返回一个承诺(但直接来自您的exports.auth
函数,而不是其他内部的回调函数。)
使用上述版本,您可以使用以下方式调用它:
auth(username, password, session, function (isAuth) {
// you have your isAuth here
});
另一种选择是使用承诺。您可以看到其他一些答案,其中我解释了回调和承诺之间的区别以及如何更详细地使用它们,这可能对您有所帮助:
但首先你需要对回调感到满意。
此外,从不将密码以明文形式存储在数据库中。说真的,使用一些像Passport一样的解决方案。我写了答案来解释使用回调的过程,而不是赞同以特定方式使用身份验证的想法。你被警告了。