Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Express和Passport JS重定向节点中的路由_Javascript_Node.js_Express_Url Routing_Passport.js - Fatal编程技术网

Javascript 使用Express和Passport JS重定向节点中的路由

Javascript 使用Express和Passport JS重定向节点中的路由,javascript,node.js,express,url-routing,passport.js,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

假设我有一个使用Express Router定义的路由,用于呈现付款表单:

router.get('/payment', (req, res) => {
  if (req.user) {
    res.render('payment', { user: req.user });
  } else {
    res.redirect('/login');
  }
});
如果我没有登录,那么我应该被带到登录页面,当我登录时,我希望被重定向回付款表单

我的登录会话是使用Passport构建的。以下是我的登录后路径的外观:

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”

我很高兴它有帮助:)