javascript - Meteor 中使用 bcrypt.compare 驗證密碼,如何在回呼函數中修改全域變數?
过去多啦不再A梦
过去多啦不再A梦 2017-05-16 13:45:27
0
1
839

如題,自己造輪子的過程中,在伺服器端利用 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

#
过去多啦不再A梦
过去多啦不再A梦

全部回覆(1)
Peter_Zhu

bcrypt.compare 是一個非同步方法,當你console.log的時候,info還沒有被賦值,這種情況下你應該把你的方法也改成異步方法,讓userLogin回傳Promise,然後在bcrypt完成以後resolve( info)

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板