为什么快递匹配两条路线?

Why is express matching two routes?

我有一辆快车 API 有很多路线。

routes.get('/',                      perms('read', 'document'),   r(CRUD.getAll))
routes.get('/search',                perms('read', 'document'),   r(CRUD.search))
routes.get('/:id',                   perms('read', 'document'),   r(CRUD.getById))

我确保 /search/:id 之上,但是,当一个新请求进入 /search 时,我看到两个端点都被点击了(我添加了一个 console.log 在每个函数中)。

我尝试翻转两者,在这种情况下,只有 /:id 成功了。

知道为什么会这样吗?

将 Express 路由视为具有匹配规则 (url) 的一组处理程序(中间件)。当一个请求进来时,路由器从头开始检查数组中的每一项。如果它匹配规则,那么处理程序是 运行(有些没有条件,所以它们只是在每个请求上 运行 :))。当匹配到单个 url 时,请求链 不会结束 !您可以对同一个请求执行多个处理程序(这正是中间件的工作方式)。

因此,这实际上取决于处理程序内部发生的情况。您可以告诉它继续列表中的下一项,并且 if 匹配 - 将执行下一个处理程序(如 /search/:id,将再次搜索)。

确保结束你的回复。如果您调用 next 并使用什么参数,请当心。 Post 处理程序的一些示例以便对其进行更多调试:)