2017-01-02 3 views
0

So habe ich vor kurzem begonnen, Promises (Bluebird) zu lernen und jetzt versuche ich, sie so viel wie möglich zu verwenden, aber ich bin ein bisschen verwirrt, wenn ich Versprechen in diesem Fall zurückgeben muss.Verwirrt über Versprechen. Muss ich hierher zurückkehren?

Hier habe ich einen Pass LocalStrategy, dass ich gemacht:

passport.use(new LocalStrategy(function(username, password, done) { 
    users.get(username) // A 
     .then(function(user) { 
      if (!user) { 
       return done(null, false, { message: 'Incorrect username.' }); 
      } 
      bcrypt.compare(password, user.password).then(function(result) { // B 
       if (result) { 
        return done(null, user); 
       } 
       return done(null, false, { message: 'Incorrect password.' }); 
      }); 
     }) 
     .catch(function(err) { 
      return done(err); 
     }); 
})); 

users.get(username) auf Linie A die pg-promise Bibliothek verwendet ein Versprechen zurückzugeben, die in einen Benutzer beheben, wenn man in der Datenbank gefunden wird und auf false, wenn Der Benutzer wurde nicht gefunden.

bcrypt.compare Zeile B verwendet bcrypt, um zu überprüfen, ob das Passwort und der Hash übereinstimmen. Es gibt ein Versprechen zurück, das sich zu wahr oder falsch auflösen wird.

Der Code funktioniert perfekt, ich bin nur verwirrt, wenn Linie A und B wie so

return users.get(username) // A 

return bcrypt.compare(password, user.password).then(function(result) { // B 

Der Code funktioniert mit und ohne Rückführung der Versprechen zurückkehren.

Läuft Passport/Node nur bis es return done sieht? Bedeutet dies, dass diese Funktion synchron ist, obwohl alles darin asynchron ist? Normalerweise würden Sie ein Versprechen zurückgeben und dann darauf verwenden, aber da LocalStrategy .then() oder .catch() nicht verwendet, muss ich nichts zurückgeben? Jede Eingabe wird sehr geschätzt. Vielen Dank.

+0

Mindestens verwandten: http://stackoverflow.com/questions/23920589/how-to-pass-a-third-argument-to-a- callback-using-bluebird-js-nodeify – Tomalak

+0

Ich fand, dass dies ein wirklich guter Artikel ist, der Verwirrung mit Versprechen erklärt [Wir haben ein Problem mit Versprechungen] (https://pouchdb.com/2015/05/18/we-have- a-problem-with-promises.html) – ivn

+0

Tomalak, ivn: Danke, werde das überprüfen. – Nikokin

Antwort

0

Passport unterstützt keine Promise, deshalb müssen Sie in einem Callback absetzen. Sie könnten return users.get(username) aber der Rückgabewert (Versprechen) wird nie verwendet. Vergessen Sie nicht, dass Sie Kette Versprechen wie folgt aus:

users.get(username) 
    .then(function(user) { 
     if (!user) { 
      return done(null, false, { message: 'Incorrect username.' }); 
     } 
     return bcrypt.compare(password, user.password); 
    }) 
    .then(function(result) { // B 
     if (result) { 
      return done(null, user); 
     } 
     return done(null, false, { message: 'Incorrect password.' }); 
    }) 
    .catch(function(err) { 
     return done(err); 
    }); 
+0

Ok danke. Ich dachte, dass es in diesem Fall wahrscheinlich keine Rolle spielt, da es Passport egal ist. Ich habe mich nur gefragt, ob es schaden könnte, zurückzukehren oder nicht, aber ich denke nicht. Der Grund, warum ich nicht wie in Ihrem Beispiel angekettet bin, liegt darin, dass bcrypt.compare den Benutzer nicht zurückgibt, sondern nur true oder false zurückgibt, so dass ich den Benutzer nicht nach i .then() users.get (username) zurückgeben kann. – Nikokin