>我有应用程序,其中有公共路线和授权路线。公共路由也应该通过身份验证,但如果身份验证失败,则没关系。
所以我有两个路由器:
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()
则仅当该特定路由器与它设置的任何路由匹配时,中间件才会适用,而不是更改其他路由器的行为。
我理解正确吗?有没有办法解决这个问题,而不必实际向每个路由添加中间件?
有同样的问题,由于@Explosion药丸评论而得到解决。
坏:
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