node.js - ExpressJS仅将中间件应用于路由器中的路由

标签 node.js express routing

我有应用程序,其中有公共(public)路线和授权路线。公共(public)路由也应该通过身份验证,但如果身份验证失败,也没关系。

所以我有两个路由器:

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 的顺序公共(public)路线引发身份验证错误。此外,我无法收到任何 404、500 等错误,因为它们都经历了身份验证错误。

很明显,正在发生的事情是 Router.use()正在应用于具有相同根的所有路由 - 在本例中为 "/"
因此,我想如果我只使用 auth所有路由上的中间件,然后将其他中间件直接添加到路由它应该可以正常工作。但这有点让我有多个路由器。

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

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

最佳答案

有同样的问题,感谢@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

关于node.js - ExpressJS仅将中间件应用于路由器中的路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35489372/

相关文章:

node.js - 获取 Elastic BeanStalk 部署进程日志

node.js - 使用 NodeJS,如何使用 Spring Security OAuth2 制作的 JWT 检索存储在 PostgreSQL 中的 session 信息?

javascript - 在 Node-Webkit 上打印背景颜色和图像

javascript - aws-serverless-express 具有 serverless-offline 阶段中断路由

c# - 当 url 的一部分已经是另一个路由时,ASP.NET Core 3.1 中的动态路由

ruby-on-rails - Rails,将许多命名路由路由到一个操作

node.js - Expresscart安装错误npm ERR! Fibers@2.0.0 安装脚本失败

jquery - 在 Node.js 中实现 AJAX 请求服务器端的正确方法

node.js - 为什么我的 Logo 不显示 nodejs 应用程序

ruby-on-rails - rails : how do you access RESTful helpers?