假设我使用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);
});
成功后,我将重定向回上一页,但这会将我带到主页,这是有道理的。我不确定登录成功,如何将用户重定向到付款表单。
答案 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'
。