Node.js ExpressJS-中间件重定向太多
我尝试在我的Node.js ExpressJS-中间件重定向太多,node.js,express,middleware,Node.js,Express,Middleware,我尝试在我的/app路由中使用两个中间件来检查用户身份验证,然后检查他们帐户的状态。我已经准备好了这两个中间件,但是在我的req.session.accountStatus不符合我提供的条件的情况下,我遇到了无休止的重定向。通常,我试图强制用户只能访问被重定向到的页面。我是否以错误的方式使用中间件?有更好的方法吗 function isLoggedIn(req, res, next) { if (req.isAuthenticated()){ return next();
/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添加应该“打开”的路由
其次是限制性中间件:
router.use(isLoggedIn, accountStatus);
接下来是其余的路线
这样,对/app/settings/billing
的任何请求都不会通过中间件传递,也不会导致重定向循环
如果以/app
开头的任何路线都必须使用isLoggedIn
,则您可以以类似方式使用它:
router.use(isLoggedIn);
router.get('/settings/billing', ...);
router.use(accountStatus);
router.get(...);
将中间件移动到
app router.js
可能更容易
因此,您的主文件只能执行以下操作:
router.use('/app', require('./app-routes'));
在app routes.js
中,首先为URL添加应该“打开”的路由
其次是限制性中间件:
router.use(isLoggedIn, accountStatus);
接下来是其余的路线
这样,对/app/settings/billing
的任何请求都不会通过中间件传递,也不会导致重定向循环
如果以/app
开头的任何路线都必须使用isLoggedIn
,则您可以以类似方式使用它:
router.use(isLoggedIn);
router.get('/settings/billing', ...);
router.use(accountStatus);
router.get(...);
这是一个伟大的解决方案!两个快速的问题,希望你能帮助回答。1.
/login
是在我的站点routes.js
文件中定义的路由。尽管在app routes.js
accountStatus中间件中添加了对此路由的重定向,但它应该能够识别该路由,因为这两个文件都是通过附加到路由器的。请使用,对吗?2.尽管我已将/settings/billing
锚定到accountStatus
中间件,但由于它连接到路由器
?1,因此它仍然可以全局访问。是的,重定向纯粹是指示客户端“转到”另一个页面。只要该页面存在,它就应该工作。那里没有Express执行的“特殊处理”。2.不确定“锚定到中间件”是什么意思。调用/app/settings/billing
时,不应该调用accountStatus
中间件(至少,这是您想要的,不是吗?还是我误解了这个问题?)。不,这一切都是有意义的。非常感谢你的帮助!这是一个伟大的解决方案!两个快速的问题,希望你能帮助回答。1. /login
是在我的站点routes.js
文件中定义的路由。尽管在app routes.js
accountStatus中间件中添加了对此路由的重定向,但它应该能够识别该路由,因为这两个文件都是通过附加到路由器的。请使用,对吗?2.尽管我已将/settings/billing
锚定到accountStatus
中间件,但由于它连接到路由器
?1,因此它仍然可以全局访问。是的,重定向纯粹是指示客户端“转到”另一个页面。只要该页面存在,它就应该工作。那里没有Express执行的“特殊处理”。2.不确定“锚定到中间件”是什么意思。调用/app/settings/billing
时,不应该调用accountStatus
中间件(至少,这是您想要的,不是吗?还是我误解了这个问题?)。不,这一切都是有意义的。非常感谢你的帮助!