【问题标题】:Routes priority in Express: am I doing it wrong?Express 中的路线优先级:我做错了吗?
【发布时间】:2021-03-17 15:10:35
【问题描述】:

我对所有路线的 Express 优先顺序有点困惑。 这是我在互联网上遵循一些 stackoverflow 答案和其他指南所做的。

我有一些 http 请求,顺序如下:您认为正确吗?如果不是,为什么?谢谢!

app.get('/', (req, res) => {
   ...
});

app.get('/:car', (req, res) => {
   ...
});

app.get('/:car/:eng', (req, res) => {
   ...
});

app.put('/:car/:feature_id', (req, res) => {
   ...
});

app.get('/import/colors', (req, res) => {
   ...
});

app.post('/import/brands', (req, res) => {
   ...
});

app.post('/import/colors/:car_id', (req, res) => {
   ...
});

【问题讨论】:

  • 路由应该从最具体到最不具体。这是因为最不具体的总是匹配的,因此您将永远无法找到最具体的人

标签: node.js express routes


【解决方案1】:

Express 只是尝试按照它们在代码中定义的请求类型(例如 GET、POST、PUT)来匹配您的路由。因此,如果是 GET 请求,Express 仅匹配包含 GET 的路由定义。以下是您展示的路线中的一些示例。

如果有 /hello/there 的传入路由,那么它将首先匹配 app.get('/:car/:eng', ...),因为它匹配任何两个段路径,并且它是匹配顺序中的第一个路由。

如果有 /import/colors 的传入路由,那么它也将匹配 app.get('/:car/:eng', ...),因为它匹配任何两个段路径。

另一方面,如果您将代码的顺序更改为:

app.get('/import/colors', (req, res) => {
   ...
});

app.get('/:car/:eng', (req, res) => {
   ...
});

然后,/import/colors 将匹配这两个路由中的第一个,因为匹配是按照路由声明的顺序进行的。

仅供参考,一般来说,我不喜欢使用具有顶级通配符的路由,因为您会遇到各种可能的冲突,并且您可能会发现自己陷入了一个角落,以便将来进行 URL 扩展添加其他路线。

推荐

因此,如果您有重叠的路线定义,请先定义最具体的路线,以便它们有机会在更一般的路线之前进行匹配。大多数时候,我更喜欢没有重叠路由的 URL 设计,这样你就不会遇到这个问题了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多