首先,正如其他人已經在評論中指出的那樣,如果你不知道自己在做什麼,就不應該實現自己的認證邏輯。你可以使用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。驗證是錯誤的可怕的事情。 –