2014-01-21 83 views
6

我是Promises新手,並不知道如何解決此問題: 我正在做一個身份驗證系統,我的第一個電話是檢查數據庫上的電子郵件。如果用戶存在,然後檢查密碼對加密密碼...我使用這個lib bcrypt:https://npmjs.org/package/bcrypt這是不承諾兼容,所以我使用「promisify」爲以下簽名:比較(密碼,crypted_pa​​ssword,回電話)。藍鳥promisify多個論據

所以這是我的代碼:

var compare = Promise.promisify(bcrypt.compare); 

User.findByEmail(email) 
    .then(compare()) <--- here is the problem 

這是我findByEmail方法:

User.prototype.findByEmail = function(email) { 
var resolver = Promise.pending(); 

knex('users') 
    .where({'email': email}) 
    .select() 
    .then(function(user) { 
     if (_.isEmpty(user)) { resolver.reject('User not found'); } 
     resolver.fulfill(user); 
    }); 


return resolver.promise; 

}

如何將多個值分配給在這種情況下, 「比較」 的方法?我錯過了諾言的重點嗎?

+0

究竟是如何做的是'user'變量是什麼樣子? – Bergi

+0

這是一個空數組,如果沒有用戶發現,或哈希數組 – rizidoro

+0

所以'user [0]'是'crypted_pa​​ssword'參數?你從哪裏獲得代碼中的'password'? – Bergi

回答

5
.then(compare()) <--- here is the problem 

then method確實希望它返回另一個承諾[或普通值],所以你需要通過compare沒有調用它的功能。如果你需要指定的參數,使用包裝函數表達式:

User.findByEmail(email) 
    .then(function(user) { 
     return compare(/* magic */); 
    }).… 
+1

感謝Bergi,我更新了我的代碼,並且工作... – rizidoro

4

我做了什麼BERGI說,對我的作品:

this.findByEmail(email) 
.then(function(user) { 
    return compare(password, user.password); 
})