【问题标题】:ExpressJS Applying middleware only to routes in routerExpressJS仅将中间件应用于路由器中的路由
【发布时间】:2016-05-31 02:03:25
【问题描述】:

我有应用程序,其中有公共路线和授权路线。公共路由也应该通过auth,但是如果auth失败,也没关系。

所以我有两个路由器:

var publicRoutes = express.Router();
var secretRoutes = express.Router();

publicRoutes
    .use(auth)
    .use(ignoreAuthError);

publicRoutes.get('/public', function(req, res){
    res.status(200).send({message: "public"});
}); 

secretRoutes
    .use(auth)
    .use(handleAuthError);

secretRoutes.get('/secret', function(req, res){
    res.status(200).send({message: "secret"});
}); 

...

app.use(publicRoutes);
app.use(secretRoutes);

现在一切正常,但如果我更改 app.use 公共路由的顺序,则会引发身份验证错误。我也无法收到任何 404、500 等错误,因为它们都经历了身份验证错误。

很明显,正在发生的事情是Router.use() 被应用于具有相同根的所有路由 - 在本例中为"/"

因此,我认为如果我在所有路由上仅使用 auth 中间件,然后将其他中间件直接添加到路由中,它应该可以正常工作。但这有点妨碍我拥有多个路由器。

我希望,如果我使用Router.use(),则仅当该特定路由器与它设置的任何路由匹配时才会应用中间件,而不是改变其他路由器的行为。

我理解正确吗?有什么方法可以处理这个问题,而不必为每条路由添加中间件?

【问题讨论】:

  • 这就是快速路由器的工作方式——它基于路由命名空间。试试app.use("/public", publicRoutes); app.use("/secret", secretRoutes)
  • @ExplosionPills 是的,但是我必须将所有路由都基于这些命名空间。所以所有路由都是/secret/something 等,这是不可取的。
  • 我明白,但我认为这只是 Express 的一个限制。不过,也许其他人有更好的解决方案。
  • 是的,我明白,不幸的是,这似乎令人失望,因为如果我使用app.use() 而不是router.use(),它实际上会产生相同的结果,并且路由器成为我严格意义上的一种方式对路线进行分类,而不是对功能进行分类。只是看起来是不必要的限制。
  • 实际上在 github 上的 expressjs 问题上也有完全相同的讨论 - github.com/expressjs/express/issues/2760

标签: node.js express routing


【解决方案1】:

遇到了同样的问题,感谢@Explosion Pills 的评论解决了。

不好:

app.use(secretRoutes); // router.use calls won't be scoped to "/secret" 
app.use(publicRoutes); // public routes will be impacted

好:

app.use("/secret", secretRoutes); // router.use calls will be scoped to "/secret" 
app.use("/public", publicRoutes); // public routes won't be impacted

【讨论】:

    猜你喜欢
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多