ExpressJS仅将中间件应用于路由器中的路由

问题描述 投票:6回答:1

我有我拥有公共路线和授权路线的应用。公用路由也应通过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的顺序,则公共路由会抛出auth错误。另外,我也无法收到任何404、500等错误,因为它们都经历了身份验证错误。

因此很明显,正在发生的事是Router.use()应用于具有相同根的所有路由-在这种情况下为"/"

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

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

我理解正确吗?有没有解决方法,而不必在每个路由中都添加中间件?

node.js express routing
1个回答
0
投票

有相同的问题,感谢@爆炸药评论。

Bad:

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

Good:

app.use("/secret", secretRoutes); // router.use calls will be scoped to "/secret" 
app.use("/public", publicRoutes); // public routes won't be impacted
© www.soinside.com 2019 - 2024. All rights reserved.