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

时间:2016-02-18 18:18:10

标签: node.js express routing

我有应用程序,我有公共路线和授权路线。公共路由也应该通过身份验证,但如果身份验证失败,则无关紧要。

所以我有两个路由器:

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(),只有当特定路由器匹配它设置的任何路由时,中间件才会应用,而不是改变其他路由器的行为。

我能理解这一点吗?有没有办法处理这个问题而不必在每条路线上添加中间件?

1 个答案:

答案 0 :(得分: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