提问者:小点点

使用Passport js failureRedirect方法发回数据


我有一个Passport js本地注册策略,它使用了successRedirect和failureRedirect方法。问题是,如果注册过程出错,Passport将简单地重定向回注册表单,表单中没有数据。

app.post('/signup', passport.authenticate('local-signup', {
        successRedirect: '/signup/avatar', // redirect to the secure profile section
        failureRedirect: '/signup', // redirect back to the signup page if there is an error
        failureFlash: true // allow flash messages
    }));

我的本地注册策略中存在以下情况,如果提供的两个密码不匹配,将向用户发送失败消息。

if(req.body.password != req.body.confirm_password){
                                console.log('Passwords do not match');
                                return done(null, false, req.flash('signupMessage', 'Your passwords do not match'));
                            }

与flash消息一起,我希望将数据发送回/Signup路由,并用用户提供的数据重新填充表单。

有没有方法在失败时将表单数据发送回浏览器?


共2个答案

匿名用户

答案比我想象的要简单得多。

验证应该在将数据发送到Passport js之前进行,然后如果数据无效,则可以重新呈现/Signup模板并将数据传回。

这个问题的解决方案是:NodeJS express-validator with passport

匿名用户

抱歉,经过我们的评论,我现在更明白你的要求了。您需要在passport代码中使用自定义回调。passport站点提供了以下示例:

app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
});

通过这里的闭包,您的回调可以同时访问请求和响应,因此当您处理错误状态时,您可以调用代码来更新来自发起请求的响应(例如,拉入指定的用户名或您希望重新填充注册屏幕的任何内容)。

http://passportjs.org/docs/authenticate