AWS Lambda SQS Node.js函数报Unexpected end of JSON input错误求助
问题定位与解决
这个报错的触发阶段是Lambda运行时加载部署代码的初始化环节,完全没有执行到你写的SQS处理函数、也没有解析你构造的测试事件,和这两部分内容无关。很多开发者遇到这个错会第一时间排查测试事件的JSON格式,实际上这个阶段运行时还没有加载测试事件,完全不存在解析事件JSON的逻辑。
结合报错栈的Unexpected end of JSON input特征,常见的触发原因有三类:
- 未完成TypeScript编译就直接部署源文件:Lambda的Node.js运行时无法直接解析TypeScript的类型注解、TS专属语法,加载阶段解析失败就会抛出这类通用语法错误
- 打包产物不完整:Serverless插件打包时漏了函数入口文件,部署到运行时的入口文件是空内容,运行时读不到有效代码就会触发空输入解析异常
- Handler路径配置错误:
serverless.yml里配置的函数入口指向了不存在的空文件,运行时加载时拿到空文件内容,直接报语法解析错误
排查与解决步骤
- 优先核查部署后的实际代码:
登录Lambda控制台,进入对应函数的「代码」标签页,直接打开你配置的handler对应的部署文件,确认三个检查点:- 文件不是空内容
- 代码是编译完成的纯JS语法,没有TypeScript类型注解残留
- 文件里确实导出了和handler名匹配的函数方法
- 核对本地编译与打包配置:
- 检查
tsconfig.json的编译输出配置:确认module选项设置为CommonJS,outDir指向实际的打包输出目录,不要把TS源文件、未编译的类型文件直接纳入部署包 - 核对
serverless.yml里的handler路径,必须和实际编译后的产物路径、导出的函数名完全匹配。比如编译后代码在dist/handler.js文件中导出updateDailyForecastResults方法,配置就要写dist/handler.updateDailyForecastResults
- 检查
- 做排除法快速定位:
临时把部署的入口文件替换成无依赖的最简纯JS代码测试:
如果替换后测试正常运行,说明问题完全出在之前的编译、打包、路径配置环节,不需要再调整业务代码或者测试事件结构。exports.updateDailyForecastResults = async (event) => { console.log("Function invoked"); return; };
内容的提问来源于stack exchange,提问作者arda ersoy
相关产品推荐
相关产品推荐

