我有一个简单的Lambda函数,它将项目写入DynamoDB表。 username是分区键,createDateTime是sort键。
从Lambda本身调用此函数会成功将项插入表中。但是,当通过API网关调用时,我收到以下错误
loc[0]['address_components'][0]['long_name']
# or loc[0]['address_components'][1]['long_name'] for second nested dict
我无法理解为什么我的代码在本地调用时有效,但在通过API网关调用时则无法理解?代码如下:
{
"errorMessage": "Error putting order into dynamodb: MultipleValidationErrors: There were 14 validation errors:\n* InvalidParameterType: Expected params.Item['createDateTime'] to be a structure\n* UnexpectedParameter: Unexpected key '0' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '1' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '2' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '3' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '4' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '5' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '6' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '7' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '8' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '9' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '10' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '11' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '12' found in params.Item['createDateTime']"
}
答案 0 :(得分:1)
您的地图模板中很可能存在问题。我建议您打开API的CloudWatch日志记录进行故障排除。
请参阅https://rpgreen.wordpress.com/2016/08/30/easy-api-gatewaylambda-serverless-api-loggingdebugging/
答案 1 :(得分:-1)
我也有类似的经验,并学到了以下内容:当独立测试Lambda函数(使用AWS Lambda控制台的内置“测试”功能)时,Event参数是 object ;使用内置的API网关测试功能时,事件是 string 。我通过比较两种不同方案的CloudWatch日志并注意到这两种情况下的输入看起来都相似,但用于构成格式正确的JSON的所有换行字符在事件字符串中均产生了'\ n'个字符,我的Lambda函数(使用JSON.parse()用Node.js编写)无法解释。因此,我在防弹功能中添加了以下代码,它似乎运行良好(请注意,我的代码正在检查Event内部的“ body”对象,但如果需要,可以在整个Event对象上使用):
var body;
switch(typeof(event.body)) {
case "string":
//strips all-types of linebreak and carriage return characters from the event.body string
var str = event.body.replace(/[\r\n]+/gm,"");
body = JSON.parse(str);
break;
case "object":
body = event.body;
break;
default:
throw("invalid input for event.body");
}