ExpressJS - 中间件重定向太多
ExpressJS - Middleware Too Many Redirects
我正在尝试在我的 /app
路由中使用两个中间件来检查用户身份验证,然后检查他们的帐户状态。我有两个中间件,但在我的 req.session.accountStatus
不等于我提供的条件的情况下,我 运行 陷入无休止的重定向。一般来说,我试图强制用户只能访问被重定向到的页面。我以错误的方式使用中间件吗?有没有更好的方法?
function isLoggedIn(req, res, next) {
if (req.isAuthenticated()){
return next();
}
res.redirect('/login');
}
function accountStatus(req, res, next) {
if(req.session.accountStatus == "active" || req.session.accountStatus == "trialing"){
return next();
} else {
//Endless loop. Need to fix
res.redirect('/app/settings/billing');
}
}
router.use(require('./site-routes'));
router.use('/app', isLoggedIn, accountStatus, require('./app-routes'));
将中间件移动到 app-router.js
可能更容易。
所以你的主文件只会做这个:
router.use('/app', require('./app-routes'));
在 app-routes.js
中,首先添加 URL 的路由,应该是 "open";
router.get('/settings/billing', ...);
后面是限制性中间件:
router.use(isLoggedIn, accountStatus);
其余路线紧随其后。
这样,对 /app/settings/billing
的任何请求都不会通过中间件,也不会导致重定向循环。
如果isLoggedIn
对于以/app
开头的任何路由是强制性的,你可以用类似的方式使用它:
router.use(isLoggedIn);
router.get('/settings/billing', ...);
router.use(accountStatus);
router.get(...);
我正在尝试在我的 /app
路由中使用两个中间件来检查用户身份验证,然后检查他们的帐户状态。我有两个中间件,但在我的 req.session.accountStatus
不等于我提供的条件的情况下,我 运行 陷入无休止的重定向。一般来说,我试图强制用户只能访问被重定向到的页面。我以错误的方式使用中间件吗?有没有更好的方法?
function isLoggedIn(req, res, next) {
if (req.isAuthenticated()){
return next();
}
res.redirect('/login');
}
function accountStatus(req, res, next) {
if(req.session.accountStatus == "active" || req.session.accountStatus == "trialing"){
return next();
} else {
//Endless loop. Need to fix
res.redirect('/app/settings/billing');
}
}
router.use(require('./site-routes'));
router.use('/app', isLoggedIn, accountStatus, require('./app-routes'));
将中间件移动到 app-router.js
可能更容易。
所以你的主文件只会做这个:
router.use('/app', require('./app-routes'));
在 app-routes.js
中,首先添加 URL 的路由,应该是 "open";
router.get('/settings/billing', ...);
后面是限制性中间件:
router.use(isLoggedIn, accountStatus);
其余路线紧随其后。
这样,对 /app/settings/billing
的任何请求都不会通过中间件,也不会导致重定向循环。
如果isLoggedIn
对于以/app
开头的任何路由是强制性的,你可以用类似的方式使用它:
router.use(isLoggedIn);
router.get('/settings/billing', ...);
router.use(accountStatus);
router.get(...);