【问题标题】:Exclude specified route from a middleware从中间件中排除指定路由
【发布时间】:2016-05-07 22:13:15
【问题描述】:

我有这个中间件可以检查用户会话的每个路由。如果用户登录,这只是简单地执行,转到下一个功能。

router.use(function(req, res, next){
    if(!req.user){
        res.redirect('/login');
     }else{
        res.locals.username = req.user.username;
        return next();
     }
});

但是如何将它排除在某些路线上?例如,我也想在我的应用程序中做一个公共 API。比如 example.com/api/items 不应该检查用户登录会话。

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    req.originalUrl 告诉您 URL 是什么,因此您可以通过在中间件函数中检查 URL 来决定跳过您的逻辑。

    或者,您可以为在此路由器之前处理的公共路径设置一个单独的路由器,这样如果请求与公共路径路由器匹配,则它已经被处理,因此后面的路由器中的这个中间件不会叫。这就是 Express 希望您为不同的顶级路径拥有不同的中间件的方式 - 通过使用单独的路由器。

    【讨论】:

    • 我的应用程序是一半,我不想去第二个选项。但是req.originalUrl 在这种情况下如何提供帮助?
    • @NicholeA.Miler - “应用程序已完成一半”是什么意思?对于单独的路由器,您只需将公共 API 路由放入一个新路由器中。这是用不同的中间件设计两条路径的“正确”方法,并且只需要几分钟的代码重组。我最喜欢的编码名言:“总是有足够的时间来重新做它以使其正常工作,但从来没有足够的时间在第一次就做好。”换句话说,花时间去做对。
    • 我明白了。好的,我知道了。您是说在身份验证检查中间件之前执行router.get('/api',function(){ //something }); 对吗?
    • @NicholeA.Miler - 不。我的意思是创建两个单独的路由器,每个路由器都有自己的中间件,每个路由器都针对路径的不同部分。公共 API 将不包含需要登录的中间件。另一个路由器会。
    • 在我的app.js 中,执行此行app.use('/api', require('./api'));,我有一个文件夹调用api,这是我的第二个不运行身份验证检查中间件的路由器,我做对了吗?
    猜你喜欢
    • 1970-01-01
    • 2015-01-22
    • 2017-03-05
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    相关资源
    最近更新 更多