Node调用AWS Lambda报错:Unexpected token u in JSON at position 0
问题排查与修复方案
核心问题分析
- Payload显示为字典的原因:AWS Lambda在接收
RequestResponse类型的调用时,会自动将传入的JSON字符串格式Payload解析为JavaScript对象(即你看到的字典形式),所以目标Lambda日志里的{'name':'Helen','age':23}是解析后的正常结果,并非发送时的格式错误。 - "Unexpected token u"错误原因:该错误几乎都是执行
JSON.parse(undefined)导致的。大概率是目标Lambda函数错误地对已被Lambda平台解析过的event再次执行JSON.parse(),或是调用代码在处理返回值时,尝试解析未定义的内容。
修复步骤
步骤1:修正目标Lambda(pdf-generator)的代码
如果目标Lambda存在以下错误写法:
exports.handler = async (event) => { // 错误:event已经是解析后的对象,无需再次parse const data = JSON.parse(event); // ...其他逻辑 };
直接改为使用解析后的event对象:
exports.handler = async (event) => { // 正确:直接使用Lambda平台解析后的对象 const data = event; console.log(data.name); // 输出Helen // ...其他逻辑 };
步骤2:修复调用方的返回值处理逻辑
当前代码仅获取了调用结果,未正确处理返回的Payload。Lambda返回的response.Payload是Buffer对象,需先转为字符串再解析:
const response = await lambda.invoke(params).promise(); // 正确处理返回的Payload const result = JSON.parse(response.Payload.toString()); // ...后续业务逻辑
跳过toString()直接解析Buffer,也会引发JSON解析错误。
步骤3:验证发送前的Payload格式(可选)
可以添加日志确认发送前的Payload是否为标准JSON字符串:
const datar = {"name":"Helen","age":"23"}; const payloadStr = JSON.stringify(datar); console.log('发送的Payload:', payloadStr); // 应输出{"name":"Helen","age":"23"} const params = { FunctionName: 'pdf-generator', InvocationType: 'RequestResponse', LogType: 'None', Payload: payloadStr, }; const response = await lambda.invoke(params).promise();
额外注意事项
- 确保AWS SDK初始化正确(以v2版本为例):
const AWS = require('aws-sdk'); AWS.config.update({ region: '你的Lambda所在区域' }); const lambda = new AWS.Lambda();
- 若使用AWS SDK v3,调用逻辑需调整,需确认项目依赖的是
aws-sdk(v2)还是@aws-sdk/client-lambda(v3)。
内容的提问来源于stack exchange,提问作者Helen Helen
相关产品推荐
相关产品推荐

