Express路由顺序影响应用运行:调换路由后为何失效?
Express路由顺序影响功能的原因及工作机制
问题原因
你遇到的情况核心在于Express路由是按定义顺序从上到下匹配的。
当把/campgrounds/:id这个通用动态路由放在/campgrounds/:id/edit前面时,所有形如/campgrounds/xxx的请求(包括/campgrounds/xxx/edit)都会被先匹配到/campgrounds/:id——Express会把xxx/edit直接解析成:id的参数值,然后执行对应的show页面渲染逻辑,后续的edit路由根本没机会被触发,自然无法正常加载编辑页面。
Express路由的具体工作机制
路由存储规则
Express会将你定义的所有路由(包含HTTP方法、路径规则、处理函数)按照你编写的顺序,依次存入一个内部维护的路由数组中。请求匹配流程
当服务器收到HTTP请求时,会按顺序遍历路由数组,逐个校验:
- 先校验请求的HTTP方法(GET/POST等)是否与路由定义的方法一致;
- 再通过
path-to-regexp库将路由路径转换为正则表达式,校验请求URL是否符合路径规则; - 只要找到第一个同时满足方法和路径匹配的路由,就会立即执行其处理函数,并且终止后续所有路由的匹配流程。
- 路由优先级逻辑
带有固定后缀的具体路由(比如/campgrounds/:id/edit)比仅含动态参数的通用路由(比如/campgrounds/:id)匹配精度更高,必须把这类具体路由放在通用路由前面,才能保证请求被正确匹配到对应的处理逻辑。
内容的提问来源于stack exchange,提问作者Chirag_ _Gupta
相关产品推荐
相关产品推荐

