升级koa-router@13.0.1后async fs.promises.readFile报错,低版本正常
Koa-router升级后路由正则引发的异常解决
问题根源
你遇到的异常本质是koa-router@13.0.1升级了依赖的path-to-regexp库到v7+版本,旧版的路由参数正则写法不再兼容,导致路由解析失败,进而触发了看似和readFile相关的错误(实际错误栈指向pathToRegexpError,说明问题出在路由定义上)。
koa-router@12及之前版本用的path-to-regexp版本较低,支持松散的参数正则写法;但v13对路由语法的校验更严格,旧写法会被判定为无效正则。
错误的路由写法(旧版兼容,新版失效)
const Router = require("@koa/router"); router.get( "/pkg/get-details/:labelSerialNumber(\d-[0-9A-Za-z]{12})/", // 你的处理逻辑 );
两种修正方案
方案1:修正字符串路由的正则格式
需要给参数里的正则额外套一层括号,同时转义字符串中的反斜杠(JavaScript字符串里\d必须写成\\d才能被正确识别为正则的数字匹配符):
const Router = require("@koa/router"); router.get( "/pkg/get-details/:labelSerialNumber((\\d-[0-9A-Za-z]{12}))/", // 你的处理逻辑 );
方案2:直接使用正则字面量定义路由
这种方式无需处理字符串转义,更直观:
const Router = require("@koa/router"); router.get( /^\/pkg\/get-details\/(\d-[0-9A-Za-z]{12})\/$/, (ctx) => { // 通过ctx.params[0]获取匹配到的labelSerialNumber const labelSerialNumber = ctx.params[0]; // 后续业务逻辑 } );
验证说明
修正路由定义后,koa-router@13.0.1就能正常解析路由规则,不会再触发pathToRegexpError。你原本的文件哈希生成逻辑(包括calculateFileSHA256Hash函数和Promise.all的调用)本身没有问题,之前的异常只是路由解析失败引发的连锁反应。
内容的提问来源于stack exchange,提问作者Barry Andrews
相关产品推荐
相关产品推荐

