を停止していない私は私のバックエンドAPIの認証ルートを作成します。次の(ERR)実行
const express = require("express");
const jwt = require("jsonwebtoken");
const User = require("../models/User");
let router = express.Router();
router.post("/", (req, res, next) => {
const { username, phone, password } = req.body;
if (!(username || phone) || !password) {
let err = new Error("invalid parameters");
err.status = 400;
next(err);
}
// XXX: Perhaps a better way to do this
let params = {};
if (username) {
params.username = username;
}
if (phone) {
params.phone = phone;
}
User.findOne(params)
.then(user => {
if (!user) {
let err = new Error("invalid credentials");
err.status = 401;
next(err);
}
user.checkPassword(password, (err, isMatch) => {
if (err) {
next(err);
}
if (!isMatch) {
console.log("we get here");
let err = new Error("invalid credentials");
err.status = 401;
next(err);
}
console.log("we also get here");
res.send({
token: jwt.sign(
{
_id: user._id,
username: user.username,
phone: user.phone
},
req.app.get("jwtSecret")
)
});
});
})
.catch(err => {
next(err);
});
});
module.exports = router;
有効なユーザ名が、無効なパスワードを渡すとき、私は出力を得る:
we got here
we also got here
Error: Can't set headers after they are sent.
at ...
next(err)
が実行フローを停止していないため、応答が2回送信されるためです。
はなぜnext(err)
実行フローを停止されていませんか?
私はあなたの答えができ:)を受け入れるだろう。約束を使用する例を示すことは可能ですか?私はそれらをよく理解しておらず、このインスタンスでどのように使用できるのか興味があります。 – carloabelli
@dedmass - どのデータベースを使用していますか? – jfriend00
mongodb/mongoose。私はそこに約束をしていると思う。 checkPasswordメソッドは、コールバックを必要とするbcrypt.compareを使用します。 – carloabelli