使用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'
来代替。