【问题标题】:ExpressJS - Middleware Too Many RedirectsExpressJS - 中间件重定向过多
【发布时间】:2017-05-07 23:54:08
【问题描述】:

我正在尝试将两个中间件与我的 /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'));

【问题讨论】:

    标签: node.js express middleware


    【解决方案1】:

    将中间件移动到app-router.js 可能更容易。

    所以你的主文件只会这样做:

    router.use('/app', require('./app-routes'));
    

    app-routes.js中,你首先为应该“开放”的URL添加路由;

    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(...);
    

    【讨论】:

    • 这是一个很好的解决方案!两个简单的问题,希望你能帮助回答。 1. /login 是在我的site-routes.js 文件中定义的路由。尽管在app-routes.js accountStatus 中间件中添加了对该路由的重定向,但它应该识别该路由,因为这两个文件都通过.use 附加到router,对吗? 2. 即使我将/settings/billing 锚定到accountStatus 中间件,由于它附加到router,它仍然可以全局访问?
    • 1.是的,重定向纯粹是对客户端“转到”另一个页面的指示。只要该页面存在,它就应该可以工作。 Express 在那里没有执行“特殊处理”。 2.不确定“锚定到中间件”是什么意思。当/app/settings/billing 被调用时,accountStatus 中间件根本不应该被调用(至少,这就是你想要的,不是吗?还是我误解了这个问题?)。
    • 不,这一切都说得通。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多