2014-01-21 4 views
6

Я новичок в Promises и не знаю, как решить эту проблему: Я занимаюсь системой auth, и мой первый звонок - проверить электронную почту в базе данных. Если пользователь существует, то проверьте пароль на пароль bcrypted ... Я использую эту lib для bcrypt: https://npmjs.org/package/bcrypt, которая не обещает быть совместимой, поэтому я использую «promisify» для следующей подписи: compare (password, crypted_password, Перезвони).Bluebird 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_password'? Откуда вы получаете пароль из своего кода? – Bergi

ответ

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

then method делает ожидать функцию, которая возвращает другое обещание [или цилиндрическое значение], так что вам нужно будет пройти compare без вызова его. Если вам необходимо указать аргументы, используйте функцию обертки выражение:

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

благодарит Берги, я обновил свой код этим и работает ... – rizidoro

4

я сделал именно то, что сказал Берги и работаю для меня:

this.findByEmail(email) 
.then(function(user) { 
    return compare(password, user.password); 
}) 
Смежные вопросы