使用Express和Passport JSredirect节点中的路由

比方说,我有一个路由定义使用快速路由器来呈现付款方式:

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

如果我没有login,那么我应该被带到login页面,当我login时,我想被redirect到付款表单。

我的login会话是使用Passport构build的。 以下是我的POSTlogin路线的样子:

 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); }); 

一旦成功,我会重新回到上一页,但是这会将我带到主页,这是有道理的。 我不确定login成功,我如何将用户redirect到付款表格。

有几种方法可以做到这一点。 基本的想法是存储您想要用户redirect到的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' req.session.returnURL || 'back'确定returnURL是否存在returnURL ,将使用'back'来代替。