Node.js Express框架路由注册逻辑与请求响应处理流程问询
问题1:应用启动时是否已完成所有路由创建?
是,启动阶段执行完路由加载代码后,所有路由就已经全部创建完成,可正常匹配请求,原因如下:
- Node.js启动代码为同步顺序执行,
app.use('/api', router)执行完成后会立即执行后续的4个路由文件加载逻辑 - 你传入各个路由文件的是同一个
router实例的引用,路由文件内部调用router.get()/router.post()等API时,都是直接往这个共享实例上挂载子路由规则 - Express注册路由时不会生成「路由快照」:
app.use挂载router的时候,只是把router的处理函数注册为/api前缀对应的中间件,不会保存挂载瞬间的router子路由状态,所有启动阶段同步添加的子路由都会在应用开始监听端口前全部生效,不会影响后续请求匹配。
问题2:命中
/api路径请求时,后端最先执行的流程是什么? 请求进入Express实例后,匹配到/api前缀时的执行顺序如下:
- 请求先经过所有提前注册的全局前置中间件(比如通过
app.use注册的express.json()、CORS、日志中间件等),直到匹配到/api前缀对应的路由规则 - 匹配到规则后,最先触发的是**
router实例内置的handle处理函数**,该函数会先执行两个核心逻辑:- 剥离请求路径中的
/api前缀,例如请求/api/user/login会被处理为/user/login再进入router内部匹配逻辑 - 按注册顺序遍历
router内部维护的中间件、子路由栈,依次匹配路径和请求方法,命中后执行对应的处理逻辑
- 剥离请求路径中的
补充说明:即使你在应用启动完成、已经开始监听端口之后再往该
router实例上挂载新的子路由,新路由也会对后续请求生效,原因就是上文提到的Express不会做路由快照,请求匹配时才会遍历router的当前路由栈。
内容的提问来源于stack exchange,提问作者Swiss bobo
相关产品推荐
相关产品推荐

