通过API Gateway调用Lambda时DynamoDB.put失败,测试配置正常
问题分析:API Gateway触发Lambda写入DynamoDB时出现参数缺失错误
这个问题我碰到过好几次了,核心原因是API Gateway和Lambda测试环境传递event.body的格式完全不一样:
- 你在Lambda控制台测试时,直接传入的
event.body是一个JavaScript对象,所以dynamodb.put(event.body)能正常识别TableName和Item这些参数; - 但通过API Gateway发送POST请求时,哪怕你发送的是JSON格式的请求体,API Gateway都会自动把它转换成JSON字符串存在
event.body里。这时候你直接把字符串传给dynamodb.put(),DynamoDB客户端自然找不到需要的TableName和Item键——它拿到的只是一串文本,不是包含这些键的对象。
解决方案:解析JSON字符串为对象
只需要在Lambda函数里新增一步,把event.body从字符串解析成JavaScript对象,再传给DynamoDB的put方法即可。修改后的代码如下:
const AWS = require('aws-sdk'); const dynamodb = new AWS.DynamoDB.DocumentClient({region: 'eu-west-1'}); exports.handler = async (event) => { try { console.log("event.body contents", event.body); console.log("Inserting into DynamoDb..."); // 关键步骤:将JSON字符串解析为对象 const putParams = JSON.parse(event.body); await dynamodb.put(putParams).promise(); return { statusCode: 200, body: JSON.stringify({message: 'Success'}) }; } catch (error) { console.error("Error processing request:", error); return { statusCode: 400, body: JSON.stringify({message: 'Invalid request body', error: error.message}) }; } };
额外提醒
建议加上try-catch块处理解析失败的情况(比如用户发送的请求体不是合法JSON),这样能返回更友好的错误响应,避免函数直接抛出未处理的异常。
内容的提问来源于stack exchange,提问作者August Williams
相关产品推荐
相关产品推荐

