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

Redirecting routes in Node using Express and 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);
});

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

有几种方法可以做到这一点。基本思想是存储您希望将用户重定向到的 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'