Javascript 从中间件中排除指定的路由

Javascript 从中间件中排除指定的路由,javascript,node.js,express,Javascript,Node.js,Express,我有一个中间件,它检查用户会话的每个路由。这只是简单地做,如果用户登录,转到下一个功能 router.use(function(req, res, next){ if(!req.user){ res.redirect('/login'); }else{ res.locals.username = req.user.username; return next(); } }); 但如何将其排除在特定路线之外?例如,我也想在

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

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不应检查用户登录会话。

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


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

我的应用程序已经完成了一半,我不想转到第二个选项。但是在这种情况下,
req.originalUrl
如何帮助?@NicholeA.Miler-什么是“应用程序是一半”的意思?对于单独的路由器,您只需将公共API路由放入新的路由器。这是使用不同中间件设计两条路径的“正确”方法,只需几分钟的代码重组。我最喜欢的编码语录是:“总是有足够的时间重新做一次,让它正确工作,但从来没有足够的时间在第一次做正确的事情。”换句话说,花时间做正确的事情。我明白了。好的,我明白了。你说的是do
router.get('/api',function(){//something})
在验证前检查中间件,对吗?@NicholeA.Miler-否。我说的是创建两个单独的路由器,每个路由器都有自己的中间件,每个路由器都指向路径的不同部分。公共API将不包含需要登录的中间件。另一个路由器将。在我的
app.js
中,执行这一行
app.use('/api',require('/api')),我有一个文件夹调用
api
,这是我的第二个路由器,没有运行auth-check中间件,我做得对吗?