首先,正如其他人已经在评论中指出的那样,如果你不知道自己在做什么,就不应该实现自己的认证逻辑。你可以使用Passport。
现在,到您提供的代码。这里有几个问题。
,想到的第一件事是,你使用:的
var isAuth = username === data['username'] & password === data['password'];
代替:
var isAuth = username === data['username'] && password === data['password'];
但是,这只是一个错字。现在,更基本的东西。
您不能返回isAuth
变量,因为您要返回给谁?如果您认为它将返回给exports.auth
的调用者,那么您就错了 - exports.auth()
将在return isAuth;
运行之前返回。
而且,如果宇检查错误与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一样工作的其他解决方案。我写了答案来解释使用回调的过程,而不是认可以特定方式使用验证的想法。你被警告了。
来源
2016-11-10 14:20:32
rsp
为了安全起见,我建议你试试[护照](https://github.com/jaredhanson/passport),而不是实施自己的验证模块。 – chridam
^听@chridam。验证是错误的可怕的事情。 –