前言
在 Express 开发中,一定要注意路由的挂载顺序,特别是挂载了中间件的路由!否则很容易出现逻辑错误。
例如,我在 '/'
路由上附带了一个鉴权前置中间件 ,而 '/waibu'
路由用于给外部服务使用,也有一个特定的鉴权前置中间件。如果顺序是如下这样:
js
/* 伪代码 */
app.use(
'/',
middleware1
)
app.use(
'/waibu',
middleware2
)
那么请求 /waibu
路由的请求会被 middleware1
进行校验,造成逻辑错误。因为 /waibu
路径在 Express 的路由匹配规则中,会被视为 /
的子路径,所以 /waibu
的请求会先经过 /
的中间件。
解决方法
解决方法非常简单,只需要调整路由挂载顺序即可:
js
/* 伪代码 */
app.use(
'/waibu', // 先挂载
middleware2
)
app.use(
'/', // 后挂载
middleware1
)
原理解析
Express 的路由匹配 是按照代码中挂载的顺序依次进行的。
当一个请求到达服务器时,Express 会从上到下 依次匹配挂载的路由和中间件。如果先挂载了 /
的中间件,那么任何以 /
开头的路径(包括 /waibu
)都会先经过这个中间件。
通过调整挂载顺序,将更具体的路径(如 /waibu
)放在更通用的路径(如 /
)之前,可以确保请求能够正确地匹配到对应的中间件。
注意事项
- 明确路由优先级 :在设计路由时,要明确哪些路由是更具体的,哪些是更通用的。更具体的路由 应该优先挂载。
- 避免路径冲突:尽量避免路径设计过于相似,以免导致路由匹配的混淆。
- 测试路由顺序:在开发过程中,可以通过编写单元测试来验证路由的挂载顺序是否正确,确保逻辑符合预期。
总结
午睡去了! 拜拜(●'◡'●)!