Ich habe eine grundlegende Mungo-Authentifizierung, mit bcryptjs Hash-Passwörter. Sowohl bcrypt und mongoose versprechen zurück. In meinem routes.js ich das folgende Skript haben, die nach dem Auffinden der Benutzer in der db klemmt:Wie ruft man eine Funktion auf, die ein Versprechen auf ein Ergebnis eines Versprechens zurückgibt?
routes.post('/auth', (req, res)=> {
User.findOne({'local.username': req.body.username})
.then(
user=> Promise.all([user, user.validate(req.body.password)])
)
.then(
results => {
console.log(results);
res.json({token: jwt.sign({id: results[0]._id}, config.secret)});
}
)
.catch(
err=> console.log(err)
);
});
Wie man sehen kann ich den Benutzer zu finden, und dann versuchen, die Validate-Methode zu nennen (die aufgerufen wird) , aber es löst weder das Versprechen noch einen Fehler. In meinem user.js die meine UserSchema definiert habe ich diesen Code Passwörter vergleichen:
UserSchema.methods.validate = function (password) {
return bcrypt.compare(password, this.local.password);
};
Dies genannt wird, aber die zurückgegebene Versprechen scheint, wie es verschwindet, ist es nicht gelöst wird, wird die Ergebnisse Variable nie protokolliert.
Eine weitere Sache, wenn ich Benutzer Validierungscode zu dieser bearbeiten:
UserSchema.methods.validate = function (password) {
return bcrypt.compare(password, this.local.password).then(
results => {
console.log(results)
}
)
};
ich wahr bekommen angemeldet zu trösten, so muss es funktionieren, aber ich will nicht mein Versprechen hier lösen, ich will den .then (...) in meinem Router anzubringen, ist das nicht möglich?
Was mache ich falsch?
UPDATE:
Wenn ich das vergleichen Methode in dem routes.js setzte es funktioniert, aber das ist nicht das, was ich tun will, ich will es in dem user.js halten, aber ich dachte, Dies könnte auf das Problem hinweisen, das ich immer noch nicht sehen kann. Ich schätze ich muss dann sofort auf das Versprechen eingehen, aber ich verstehe nicht warum.
User.findOne({'local.username': req.body.username})
.then(
user=> Promise.all([user, bcrypt.compare(req.body.password,user.local.password)])
)
.then(
results => {
console.log(results);
res.json({token: jwt.sign({id: results[0]._id}, config.secret)});
}
)
.catch(
err=> console.log(err)
);
'' Promise.all ([user, user.validate (req.body.password)]) '' 'sollte sein' Promise.all ([Promise.resolve (Benutzer), user.validate (req.body.password)]) '' – MatthieuLemoine
@MatthieuLemoine Ja, das scheint vernünftig, aber versuchte es und es funktioniert nicht: S – godzsa
Nicht sicher, aber ich denke, Ihre validierte Methode sollte Lösen Sie auch das Versprechen. –