Ich baue eine Express-Js-API mit Reisepass js, und um benutzerdefinierte Fehler Messages als JSON formatiert werden kann ich benutze custom callbacks.Passport JS Benutzerdefinierte Rückruf genannt 3 mal
Wenn ich eine unbekannte E-Mail zur Verfügung stelle, wird der benutzerdefinierte Rückruf, den ich schrieb, 3 Mal aufgerufen, was zu Unhandled rejection Error: Can't set headers after they are sent.
führt. Was macht Sinn.
Jede Hilfe wird geschätzt.
Hier ist meine Umsetzung:
Strategie:
const localLoginStrategy = new LocalStrategy({
usernameField: "emailAddress"
}, (emailAddress, password, done) => {
// Called once
User.findOne({
where: { emailAddress }
}).then((existingUser) => {
// Called once
if (!existingUser) { return done(null, false, { message: "Invalid email/password combination", status: 401 }); }
return existingUser.comparePassword(password);
}).then((userData) => {
return done(null, userData);
}).catch((err) => {
return done(null, false, { message: "Invalid email/password combination", status: 401 });
});
});
passport.use(localLoginStrategy);
Express Middleware für die Authentifizierung mithilfe von benutzerdefinierten Rückruf:
const requireUsernamePassword = (req, res, next) => {
if(!req.body.emailAddress || !req.body.password) {
return res.status(400).json({ message: "No emailAddress and/or password provided" });
}
// Called once
passport.authenticate("local", { session: false }, (err, user, info) => {
// Called three times!
console.log("authenticate callback")
if (!user || err) {
return res
.status(info.status || 400)
.json({ message: info.message || "Authentication error" });
}
req.user = user;
return next();
})(req, res, next);
};
Was ruft Ihre requireUsernamePassword-Middleware auf? Können die Mehrfachanrufe von früher im Call-Stack kommen? Könntest du versuchen, einen verrutschten User.findOne (....) hinzuzufügen? Ich bezweifle, dass es daraus kommt, aber es kann wehtun und es ist generell (nicht immer) gut, Versprechungen zurückzugeben. Haben Sie den Wert von err/user/info für jeden der 3 Anrufe protokolliert? – Boris