Fastify 大小写不敏感路由正常,404 却跑到根处理器
Fastify 5.12.7 正常路由与独立 404 路由器未共享全部匹配选项,可能跳过插件 not-found handler。核对大小写、重复斜杠及参数边界,审查局部补传并验证封装钩子。
/API/known 能进入 /api 插件,/API/missing 却跑到根级 404,插件自己的 not-found handler 与钩子没有执行。Fastify 已设置 caseSensitive: false 时,不能仅因正常路由匹配成功,就认定 404 也采用相同规则。
5.12.7 使用独立路由器查找封装范围内的 404。初始化时只传入少量选项,没有把大小写、重复斜杠、分号分隔和最大参数长度等配置一起传入。这使正常路由与 404 前缀判断可能采用不同条件。
用正常命中与同范围缺失路径成对检查
保留大小写不同的已存在路径和缺失路径,分别记录实际 handler。重复斜杠、分号及长参数需要各自的配置样本,不能把所有异常都描述为大小写问题。
这里不是找不到目标资源就应该返回 200;问题在于哪个封装实例负责返回 404,以及它的哪些钩子被执行。仅把根级错误消息改成插件的文案,不会自动补回插件的鉴权、日志或上下文。
修正独立 404 路由器的配置边界
需要保留这些匹配选项的工程,可以在锁定的 5.12.7 依赖补丁中审查 fourOhFour 的 FindMyWay 初始化。应把相关选项显式传入,同时保留原来的错误与默认路由回调:
const router = FindMyWay({
caseSensitive: options.routerOptions.caseSensitive,
ignoreDuplicateSlashes: options.routerOptions.ignoreDuplicateSlashes,
useSemicolonDelimiter: options.routerOptions.useSemicolonDelimiter,
maxParamLength: options.routerOptions.maxParamLength,
onBadUrl: options.routerOptions.onBadUrl,
onMaxParamLength: options.routerOptions.onMaxParamLength,
defaultRoute: fourOhFourFallBack,
});
这是框架内部对应位置的补丁片段,不是业务 app 新建另一个路由器的配置。通过已有的包补丁与代码审查流程维护,并核对该版 FindMyWay 接受的选项。不要把整个 options 对象无差别展开,覆盖内部回调或带入无关配置。
改动前保存锁文件与原包来源。撤回时移除局部补丁、按原锁恢复依赖,再检查正常命中和 404;正式框架更新确实覆盖这一分支以后,再评估移除临时补丁。5.12.7 本身并不包含上面这组补传配置。
不要在全局把请求地址转成小写
路径参数可能区分大小写,查询值和百分号编码也有自己的含义。为了让 404 前缀匹配而重写整个 URL,可能把资源或租户映射到另一个值。
无法立即改依赖时,至少让根级 404 保持必要的公共安全与错误处理,并明确插件范围尚未覆盖;不要据此宣称封装钩子已经恢复。真实修复后,回查插件与根的 handler、鉴权、日志及正常路由,分别覆盖原来的四类选项。错误体看起来一样,不足以证明选中了正确上下文。


