【问题标题】:Express router order of request executions: `/state/:params` vs `/state/absolute-path`请求执行的快速路由器顺序:`/state/:params` vs `/state/absolute-path`
【发布时间】:2018-08-12 19:10:55
【问题描述】:

如果我有两个 REST 端点

app.get('/something/:id', ...handlers);
app.get('/something/else', ...handlers);

我向http://host:port/something/else发送请求

有没有办法让 Express 路由器先执行具有绝对路径的端点 (/something/else),然后再执行与查询参数匹配的端点 (/something/:id)?

我知道我可以颠倒调用顺序并最后使用查询参数指定端点。但从逻辑上讲,绝对路径应该优先于查询参数,我相信这是 Koa.js 的默认行为

【问题讨论】:

  • 改变路线的顺序,把else放在上面,把带参数的放在下面。它应该工作

标签: node.js express


【解决方案1】:

只需将更具体的路线放在第一位,然后将通配符路线放在第二位。路由按顺序匹配,匹配的第一个处理请求,然后不处理其他路由。因此,将/something/else 的更具体的路由放在/something/:id 之前,您将看到/something/else 路由在URL 中正常工作。

// put wildcard route last and more specific route definitions first
// routes are matched in the order they are defined
app.get('/something/else', ...handlers);
app.get('/something/:id', ...handlers);

这确实提出了一个问题,为什么您首先将这种潜在的冲突设计到您的 URL 方案中。您实际上已经重载了 id 命名空间,并为您自己的使用保留了至少一个 id 值。这可以通过对路由定义进行仔细排序来管理,但如果您的 URL 设计一开始就没有这种冲突,通常会更好。

有没有办法让 Express 路由器先使用绝对路径('/something/else')执行端点,然后再执行与查询参数匹配的端点('/something/:id')?

是的,先定义更具体的路线。

我知道我可以颠倒调用顺序并最后使用查询参数指定端点。但从逻辑上讲,绝对路径应该优先于查询参数,我相信这是 Koa.js 的默认行为

您询问了 Express。它按照您定义的顺序匹配路由。它不会尝试猜测它“认为”您首先要匹配的路线。它允许您通过路由定义的顺序精确地定义它。

我不太了解 Koa.js,但the doc for Koa2 中有这个:现在中间件总是按照 .use()(或 .get() 等)声明的顺序运行.),与 Express 4 API 匹配。

【讨论】:

    【解决方案2】:

    express.js 没有特定的路由匹配规则来匹配路由。它会尝试将每个注册的route 与传入请求路径匹配,并为所有匹配的paths 调用route handlers。因此,以下代码将起作用。

    app.get('/something/:id', (req, res, next) => {
      console.log(`Calling with param ${req.params.id}`);
      next(); // if you remove next from here it will not call the rest of the handlers
    });
    
    app.get('/something/else', (req, res, next) => {
      console.log(`Calling with else`);
      next();
    });
    

    输出:

    因此,确保路由完全匹配的唯一方法是按特定顺序定义路由。

    app.get('/something/else', ...handlers);
    app.get('/something/:id', ...handlers);
    

    【讨论】:

      猜你喜欢
      • 2021-01-30
      • 2021-09-12
      • 2018-01-11
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多