如題,自己造輪子的過程中,在伺服器端利用 bcrypt.compare
做密碼驗證,想在回呼函數中來修改全域變數 info
,如何實現?
自己寫的程式碼如下:
Meteor.methods({
userLogin: (username, password) => {
let user = Users.find({username: username}).fetch()[0];
let info;
bcrypt.compare(password, user.password, (err, res) => {
if (err) {
info = {
status: 0,
data: err
}
}
// res == true 输入的密码与保存的密码一致
if (res) {
info = {
status: 1,
data: [{
_id: user._id,
username: user.username,
group: user.group
}]
};
} else {
info = {
status: 0,
data: "username or password invalid"
};
}
});
console.log(info);
return info;
}
});
console.log(info);
列印的內容為 undefined
嘗試將info
改成window.info
(ps:網上找到解決方案,我也不知道為什麼要這樣做), 但直接報錯,之前在寫react元件時也遇到類似的情況,透過給callback
綁定this
解決的,但在這裡給(err, res) => {}.bind( this)
後,依舊是undefined
bcrypt.compare 是一個非同步方法,當你console.log的時候,info還沒有被賦值,這種情況下你應該把你的方法也改成異步方法,讓userLogin回傳Promise,然後在bcrypt完成以後resolve( info)