API Gateway+Lambda写入DynamoDB报502及put.promise.then不是函数如何解决?
问题根因定位
- 调用方法语法错误:这是该报错最核心的触发原因。AWS SDK v2 中 DocumentClient 的 put 方法返回的是 AWS.Request 实例,需要调用带括号的
.promise()方法才能返回 Promise 对象,如果你写代码时漏写了括号,将.promise()写成了.promise,此时拿到的是函数本身而非 Promise 实例,调用.then就会抛出该异常。 - AWS SDK 版本不匹配:如果你的项目依赖的是 AWS SDK v3,就不能沿用 v2 的调用语法,v3 中没有
put().promise()这种写法,需要配合PutCommand和send()方法完成调用,版本不匹配时也会触发该错误。 - 变量覆盖问题:检查代码中实例化 DocumentClient 之后,是否有其他逻辑重新给
dynamodb变量赋值为非 DocumentClient 实例,也会导致方法调用异常。
修复方案
- 若使用 AWS SDK v2,修正调用语法即可,标准写法参考:
const AWS = require('aws-sdk'); const dynamodb = new AWS.DynamoDB.DocumentClient(); const params = { TableName: '你的DynamoDB表名', Item: { // 写入数据的字段键值对 } }; // 注意promise后必须加括号执行 dynamodb.put(params).promise() .then(res => console.log('写入成功', res)) .catch(err => console.error('写入失败', err));
- 若使用 AWS SDK v3,调整为v3标准调用写法:
const { DynamoDBClient } = require("@aws-sdk/client-dynamodb"); const { DynamoDBDocumentClient, PutCommand } = require("@aws-sdk/lib-dynamodb"); const client = new DynamoDBClient({}); const dynamodb = DynamoDBDocumentClient.from(client); const params = { TableName: '你的DynamoDB表名', Item: { // 写入数据的字段键值对 } }; dynamodb.send(new PutCommand(params)) .then(res => console.log('写入成功', res)) .catch(err => console.error('写入失败', err));
502错误说明
API Gateway返回502 Bad Gateway是该JS异常的连锁反应:Lambda执行时抛出了未捕获的错误,无法返回符合API Gateway要求的响应格式,只要修复上述代码问题,502错误会同步解决。
内容的提问来源于stack exchange,提问作者Sai Teja Gupta
相关产品推荐
相关产品推荐

