Node.js 成功,但仍在使用failureRedirect-passport

Node.js 成功,但仍在使用failureRedirect-passport,node.js,express,passport.js,passport-local,Node.js,Express,Passport.js,Passport Local,这是路线 app.post('/signup', passport.authenticate('local-signup', { successRedirect: '/', failureRedirect: '/signup', failureFlash: true })); 这是passport配置文件。表单按预期工作,并使用my mongo模式保存,但它使用的是failureRedirect而不是successRedirect,有人注意到有什么问题吗?当您对新创建的用户调用sa

这是路线

app.post('/signup', passport.authenticate('local-signup', {
  successRedirect: '/',
  failureRedirect: '/signup',
  failureFlash: true
}));

这是passport配置文件。表单按预期工作,并使用my mongo模式保存,但它使用的是failureRedirect而不是successRedirect,有人注意到有什么问题吗?

当您对新创建的用户调用save函数时,您忘了将第二个参数传递到其回调,即从db返回的用户文档

从您当前的代码逻辑来看,上一个完成函数中的用户引用的是来自findOne的回调,因此永远不会到达那里,因为如果此时有用户从服务器返回,它将执行
if(user){…}
中的所有操作

确保传递第二个参数进行保存,如下所示:

passport.use('local-signup', new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password',
    passReqToCallback: true
},
function(req, email, password, done) {
    process.nextTick(function() {
        User.findOne({ 'local.email': email }, function(err, user) {
            if(err)
                return done(err);

            if(user) {
                return done(null, false, req.flash('signupMessage', 'That email is already taken'));
            } else {
                var newUser = new User();

                newUser.local.email = email;
                newUser.local.password = newUser.generateHash(password);

                newUser.save(function(err) {
                    done(err, user);
                });
            }
        });
    });
}));
newUser.save(function(err, user) {
  done(err, user);
});