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
中间件(至少,这是您想要的,不是吗?还是我误解了这个问题?)。不,这一切都是有意义的。非常感谢你的帮助!