2014-01-21 15 views
6

Ich bin neu zu Versprechen, und ich weiß nicht, wie dieses Problem zu beheben: Ich mache ein Auth-System, und mein erster Aufruf ist, E-Mails in der Datenbank zu überprüfen. Wenn ein Benutzer existiert, dann überprüfe das Passwort mit einem verschlüsselten Passwort ... Ich benutze diese lib für bcrypt: https://npmjs.org/package/bcrypt was nicht kompatibel ist, also benutze ich "promisify" für die folgende Signatur: compare (password, crypted_password, Rückrufen).Bluebird Promisify mehrere Argumente

Also das ist mein Code:

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

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

Das ist meine findByEmail Methode:

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; 

}

Wie mehr Werte des "Vergleich" Verfahren in diesem Fall zuweisen? Verpasse ich den Punkt der Versprechen?

+0

Wie genau funktioniert das 'user' Variable aussehen? – Bergi

+0

es ist ein leeres Array, wenn keine Benutzer gefunden wurden, oder ein Hash-Array – rizidoro

+0

Also 'user [0]' ist das 'crypted_password' Argument? Woher bekommst du das Passwort in deinem Code? – Bergi

Antwort

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

Die then method hat eine Funktion erwarten, die ein weiteres Versprechen zurück [oder einen einfachen Wert], so dass Sie compare es ohne Aufruf zu passieren brauchen würde. Wenn Sie die Argumente angeben müssen, verwenden Sie eine Wrapper-Funktion Ausdruck:

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

danke Bergi, ich habe meinen Code aktualisiert und funktioniert ... – rizidoro

4

Ich tat genau das, was Bergi sagte und arbeitet für mich:

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