本地调用Serverless函数传递并获取body参数失败问题排查
问题分析与解决方案
你的问题出在本地调用时event.body的格式和真实Lambda HTTP事件不一致:
在AWS Lambda处理API Gateway的POST请求时,event.body是经过序列化的JSON字符串,所以代码里用JSON.parse(event.body)是正确的;但用serverless invoke local本地调用时,你传入的createCat.json里的body是直接传了JSON对象,Lambda运行时会把这个对象直接赋值给event.body,此时event.body是对象类型,你再用JSON.parse去解析它,就会把对象转成[object Object]字符串,自然触发JSON解析错误。
两种解决方法
方法1:修改本地调用的JSON文件,将body转为字符串格式
把createCat.json里的body值改成JSON字符串(注意转义双引号):
{ "body": "{\"name\": \"Cat cat blue\", \"age\": 4, \"color\": \"blue\"}" }
这样本地调用时,event.body就是字符串,和线上环境一致,代码不需要修改就能正常解析。
方法2:修改代码,兼容本地和线上环境
在解析前判断event.body的类型,如果是对象就直接使用,如果是字符串再解析:
import { Context } from 'aws-lambda'; // 辅助函数:从错误对象中提取信息 const getMessageFromError = (error: unknown) => { if (error instanceof Error) return error.message; return String(error); }; const createCat = async (event: any, context?: Context) => { try{ // 兼容本地(body是对象)和线上(body是字符串)环境 const data = typeof event.body === 'string' ? JSON.parse(event.body) : event.body; const name = data?.name; const age = Number(data?.age); const color = data?.color; return { statusCode: 200, body: JSON.stringify({ message: 'Cat created successfully', data: { name, age, color } }) }; } catch(error) { return { statusCode: 500, body: JSON.stringify({ message: getMessageFromError(error) }) }; } }; export default createCat;
这种方法不需要修改本地调用的JSON文件,代码自动适配两种环境。
另外注意你代码里的一个小问题:成功分支返回的statusCode写了500(错误码),应该改成200表示请求成功。
内容的提问来源于stack exchange,提问作者Bersan
相关产品推荐
相关产品推荐

