这个 ExpressJS + Passport 注册路径有什么问题? returns 400 错误请求

What is wrong with this ExpressJS + Passport signup route? It returns 400 Bad Request

我在下面实施了注册路线。它到达“用户已保存...”但请求 returns 404.

好像没有执行登录策略:

router.post("/signup", function(req, res, next) {

    var email = req.body.email;
    var password = req.body.password;

    User.findOne({ email: email },  function(err, user) {

        if (err) { return next(err); }
        if (user) {
            return res.status(409).send({message: "Duplicate user - already registered."});
        }

        var newUser = new User({
            email: email,
            password: password
        });
        newUser.save(next);
        console.log("User saved...");
    });
},
    passport.authenticate("login"),
    function(req, res) {
        return res.status(200).send({
            message: "Signup successful",
            user: req.user
        });
    }
);

我的 Passport 登录策略是这样的:

    passport.use("login", new LocalStrategy(async (email, password, done) => {
        console.log("login...");
        User.findOne({ email: email }, function(err, user) {
            if (err) { return done(err); }
            if (!user) {
                return done(null, false, { message: "No user has that email!" });
            }
            user.checkPassword(password, function(err, isMatch) {
                console.log("Checked password...");
                console.log("Error? Match?");
                console.log(err);
                console.log(isMatch);
                if (err) { return done(err); }
                if (isMatch) {
                    console.log("Returning done...");
                    return done(null, user, { message: 'Logged in Successfully' });
                } else {
                    return done(null, false, { message: "Invalid password." });
                }
            });
        });
    }));

这是我在日志中看到的内容:

User saved...
POST /signup 400 181.122 ms - -

Passport 可能会抛出 400 错误,因为 username/password 字段未设置。

Passport 需要用户名和密码,而您传递的是电子邮件和密码。所以你可以修改代码,让passport的LocalStrategy使用email作为username.

您可以按如下方式设置用户名和密码:

passport.use("login", new LocalStrategy({
        usernameField: 'email',
        passwordField: 'password',
    },async (usernameField, passwordField, done) => {
        console.log("login...");
        User.findOne({ email: usernameField }, function (err, user) {
            if (err) { return done(err); }
            if (!user) {
                return done(null, false, { message: "No user has that email!" });
            }
            user.checkPassword(passwordField, function (err, isMatch) {
                console.log("Checked password...");
                console.log("Error? Match?");
                console.log(err);
                console.log(isMatch);
                if (err) { return done(err); }
                if (isMatch) {
                    console.log("Returning done...");
                    return done(null, user, { message: 'Logged in Successfully' });
                } else {
                    return done(null, false, { message: "Invalid password." });
                }
            });
        });
    }));

您可以从 passport's 源代码 here

检查引发错误的行