【发布时间】: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