使用 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'
。
假设我有一个使用 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'
。