使用Express和Passport JS重定向Node中的路由

时间:2017-01-16 11:01:12

标签: javascript node.js express url-routing passport.js

假设我使用Express Router定义了一条路线来呈现付款方式:

router.get('/payment', (req, res) => {
  if (req.user) {
    res.render('payment', { user: req.user });
  } else {
    res.redirect('/login');
  }
});

如果我没有登录,那么我应该进入登录页面,当我登录时,我希望被重定向回付款表单。

我的登录会话是使用Passport构建的。这是我的POST登录路线的样子:

router.route('/login').post((req, res, next) => {
  req.assert('email', 'Please sign up with a valid email.').isEmail();
  req.assert('password', 'Password must be at least 4 characters long').len(4);

  var errors = req.validationErrors();
  if (errors) {
    req.flash('errors', errors);
    return res.redirect('/login');
  }

  passport.authenticate('login', {
    successRedirect: 'back',
    failureRedirect: '/login',
    failureFlash : true
  })(req, res, next);
});

成功后,我将重定向回上一页,但这会将我带到主页,这是有道理的。我不确定登录成功,如何将用户重定向到付款表单。

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。基本思想是存储您希望用户重定向到的URL。您可以通过GET参数将其存储在URL中,也可以使用会话。

这就是整个想法。

例如,要使用会话:

router.get('/payment', (req, res) => {
  if (req.user) {
    res.render('payment', { user: req.user });
  } else {
    req.session.returnURL = '/payment';
    res.redirect('/login');
  }
});

然后在/login路线中:

router.route('/login').post((req, res, next) => {
  req.assert('email', 'Please sign up with a valid email.').isEmail();
  req.assert('password', 'Password must be at least 4 characters long').len(4);

  var errors = req.validationErrors();
  if (errors) {
    req.flash('errors', errors);
    return res.redirect('/login');
  }

  passport.authenticate('login', {
    successRedirect: req.session.returnURL || 'back',
    failureRedirect: '/login',
    failureFlash : true
  })(req, res, next);
});

req.session.returnURL || 'back'行确保会话中不存在returnURL,而是使用'back'