Javascript Passport JS,错误重定向上的值为空

Javascript Passport JS,错误重定向上的值为空,javascript,node.js,express,passport.js,Javascript,Node.js,Express,Passport.js,我在我的网站上使用标准的passport本地策略(带express.js)作为注册表单。当调用failureRedirect时,它会正确地重定向回我的注册表单,但表单的所有值都被清除为空。我明白为什么会这样,因为重定向,但是。。。如果用户犯了一个简单的错误,比如忘记了复选框或者用户名已经被取了,那么这对用户来说是非常恼人的。(另外,我知道不应将密码发送回视图)。是否有办法即使在使用passport重定向后仍保留用户输入的值 //my route .post('', passport.authen

我在我的网站上使用标准的passport本地策略(带express.js)作为注册表单。当调用
failureRedirect
时,它会正确地重定向回我的注册表单,但表单的所有值都被清除为空。我明白为什么会这样,因为重定向,但是。。。如果用户犯了一个简单的错误,比如忘记了复选框或者用户名已经被取了,那么这对用户来说是非常恼人的。(另外,我知道不应将密码发送回视图)。是否有办法即使在使用passport重定向后仍保留用户输入的值

//my route
.post('', passport.authenticate('local-signup', {
    failureRedirect: '/account/signup', // redirect back to the signup page if there is an error
    failureFlash: true // allow flash messages
}), function(req, res) {
    ...
});
护照代码

passport.use('local-signup', new LocalStrategy({
        usernameField: 'username',
        passwordField: 'password',
        passReqToCallback: true // allows us to pass back the entire request to the callback
    }, function(req, username, password, done) {
        process.nextTick(function() {
            if(password != params.password2) {
                return done(null, false, req.flash('error', 'Passwords do not match.'));
            }

            User.findOne({
                'username': username
            }, function(err, user) {
                // if there are any errors, return the error
                if (err)
                    return done(err);

                if (user) {
                    return done(null, false, req.flash('error', 'That username is already taken.'));
                } else {
                 ... create a new user ...
                }

            });

        });

    }));

    function(req, username, password, done) {

如果您在路线逻辑中包装passport会怎么样。比如说,

app.post('/login', function(req, res, next) {
  // Do something here with the username & password, like
  // checking if the username is available.
  if (!username || !password) {
    // Render the login form, and pass in the username and password.
    res.render('/login', {username: username, password: password});
  } else {
   // If all is validated, attempt the login:
   passport.authenticate('local-signup', {
     failureRedirect: '/account/signup', 
     failureFlash: true
   }), function(req, res) {
     ...handle response here...
   }
  }
});

我不确定所有这些在语法上是否正确,但我们的想法是,在尝试使用Passport进行身份验证之前,您必须执行任何特定于应用程序的验证。

我想这是可行的,但它似乎不像我所希望的那样完美/干净。在我看来,这似乎是一个失败的“中间件”,它通过了
req
obj,错误将完美地工作。然后,您可以将所有验证和验证逻辑放在一个地方。虽然我同意在一个地方处理验证和验证会很好,但我认为Passport的目的只是提供验证,并将验证留给您。关于护照,第一句是“护照的唯一目的是验证请求”。。。虽然存在失败的挂钩,但我认为验证不属于这个范围,但验证是构建在策略中的。如果您省略用户名和密码,则会出现“缺少凭据”错误。是的,存在一些验证(缺少用户名和密码),但如果您希望它执行您所说的操作(存储用户名和密码),它(1)需要与所有策略(本地、Facebook、谷歌等)兼容,(2)与“用户”兼容详细信息也完全不同(这会导致不同的回调签名)。上面,您使用的是本地策略——将其与谷歌和Facebook策略进行比较,后者处理响应的方式不同。