Express分层路由GET根端点在serverless-offline下返回404 同组端点正常
serverless-offline 环境下Express根路由404问题修复
相关代码配置
- 应用入口路由(app.js):
app.use('/v1/abc/', router);
- 二级路由声明:
router.use('/:primary_id/def',defServices);
- 三级服务层路由(defServices类实现):
class defServices { constructor() { const router = new express.Router({ mergeParams: true }); router.get('/', this.func1); router.get('/:pid',this.func2); router.put('/', this.func3); return router; } async func1(req, res) { // 业务逻辑 } } export default new defServices();
- 异常请求地址:
GET http://localhost:3000/dev/v1/abc/48/def
问题表现
- 上述GET请求无法命中服务层的
GET /端点(绑定func1),返回404 - 同服务层内的其他端点可正常响应:
- 带参GET端点
/:pid(绑定func2) - PUT根端点
/(绑定func3) - 运行环境为 serverless-offline
根因说明
- serverless-offline 在转发请求到本地Express实例时,会对路径做前缀截断处理。当子路由挂载路径不带尾部斜杠、请求路径也不带尾部斜杠时,截断后传递给服务内部路由器的相对路径是空字符串,而非Express标准约定的根路径
/。 - 服务内部定义的
GET /规则,仅能匹配相对路径完全等于/的请求,空字符串无法触发该规则,因此返回404。 - 其他端点可正常响应的逻辑解释:
GET /:pid为单段路径匹配规则,Express的模糊匹配逻辑会将空字符串判定为符合该路径的匹配范围,因此可正常命中。PUT /端点可正常响应,是因为该请求实际发送时携带了尾部斜杠,截断后得到的相对路径为/,可匹配对应的PUT路由。
修复方案
- 方案1:在服务内部路由器增加空路径的匹配规则,覆盖截断后空字符串的场景:
将原路由声明
router.get('/', this.func1);
修改为
router.get('/', this.func1); router.get('', this.func1);
- 方案2:在二级路由挂载处,同时注册带尾部斜杠和不带尾部斜杠的路径,适配两种请求格式:
将原挂载配置
router.use('/:primary_id/def',defServices);
修改为
router.use('/:primary_id/def',defServices); router.use('/:primary_id/def/',defServices);
- 不建议全局修改serverless-offline的默认路径匹配配置,避免影响其他业务路由的匹配逻辑。
内容的提问来源于stack exchange,提问作者Windula Kularatne
相关产品推荐
相关产品推荐

