Serverless Framework v3.22.0自定义错误映射失效问题求助
解决Serverless Framework v3.22.0 + serverless-offline自定义错误映射失效问题
问题定位
你的配置存在几个细节问题,加上serverless-offline对API Gateway错误映射的实现差异,导致了当前失效情况:
- 部分
template字段末尾多了分号(如404、500),干扰模板解析 Content-Type的嵌套引号写法不符合规范- 正则匹配的写法在serverless-offline中存在匹配精度问题
- 直接使用
$input.path在离线环境下的解析逻辑和AWS线上有差异
修正后的配置
response: headers: Content-Type: 'application/json' statusCodes: 200: pattern: '' # Default response method 400: pattern: '.*statusCode.*400.*' template: '{ "error": $input.path("$.errorMessage") }' 401: pattern: '.*statusCode.*401.*' template: '{ "error": $input.path("$.errorMessage") }' 403: pattern: '.*statusCode.*403.*' template: '{ "error": $input.path("$.errorMessage") }' 404: pattern: '.*statusCode.*404.*' template: '{ "error": $input.path("$.errorMessage") }' 422: pattern: '.*statusCode.*422.*' template: '{ "error": $input.path("$.errorMessage") }' 500: pattern: '.*statusCode.*500.*' template: '{ "error": $input.path("$.errorMessage") }'
关键调整说明
- 移除
template末尾的多余分号,确保模板是合法的JSON结构 - 简化
Content-Type写法,去掉嵌套引号 - 放宽正则匹配规则,避免因JSON格式的空格、引号转义问题导致匹配失败
- 将
template改为完整的JSON结构,确保返回合法的JSON响应而非单纯字符串
额外注意事项
- 确保错误抛出结构正确:Lambda函数抛出错误时,必须返回包含
statusCode和errorMessage字段的对象,示例:
throw new Error(JSON.stringify({ statusCode: 400, errorMessage: "Invalid request parameters" }));
也可以使用Serverless官方错误类:
const { BadRequestError } = require('@serverless/utils'); throw new BadRequestError("Invalid request parameters");
检查serverless-offline版本:serverless-offline v10+对API Gateway错误映射的支持更完善,建议升级到与Serverless Framework v3.22.0兼容的最新版本
避免混用httpResponse配置:
httpResponse模式的错误映射逻辑和当前statusCodes配置不兼容,建议先调试好当前配置后再考虑切换模式
内容的提问来源于stack exchange,提问作者Sayf-Eddine
相关产品推荐
相关产品推荐

