私はパスポートjsを使ってエクスプレスjs apiをビルドしています.jsonとしてフォーマットされたカスタムエラーメッセージを返すためにはcustom callbacksを使用しています。Passport JS 3回コールされたカスタムコールバック
私が未知の電子メールを提供したとき、私が書いたカスタムコールバックは3回呼び出され、Unhandled rejection Error: Can't set headers after they are sent.
という結果になりました。どちらが理にかなっている。
何か助けていただければ幸いです。
戦略:カスタムコールバックを使用して認証用の
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);
エクスプレスミドルウェア:
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);
};
requireUsernamePasswordミドルウェアとは何を呼びますか?複数のコールがコールスタックの早い段階から来ることはできますか? '返品User.findOne(....)'を追加しようとしてもらえますか?それはそれが原因だとは思えませんが、それは傷つき、一般的には必ずしも約束を返す良い習慣です。 3回の通話ごとにerr/user/infoの値を記録しましたか? – Boris