Node.js 这个ExpressJS+有什么问题;护照登记路线?它返回400个错误请求

Node.js 这个ExpressJS+有什么问题;护照登记路线?它返回400个错误请求,node.js,express,passport.js,Node.js,Express,Passport.js,我在下面实现了一个注册路径。它返回“用户保存…”,但请求返回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 (

我在下面实现了一个注册路径。它返回“用户保存…”,但请求返回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错误,因为未设置用户名/密码字段

Passport需要用户名和密码,您传递的是电子邮件和密码。因此,您可以修改代码,并让passport的LocalStrategy将电子邮件用作
用户名

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

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源代码错误的行是的,您是对的,LocalStrategy构造函数缺少指定哪些字段用作用户名、密码的选项。