AWS Lambda 和 DynamoDB 空响应

AWS Lambda and DynamoDB Null Response

我正在尝试从 Lambda 函数写入 DynamoDB table。当我测试 运行 函数时,它 returns 为空,没有错误消息,也没有任何内容写入 table。函数如下。我已经为此功能设置了一个服务角色,其权限策略允许访问 'Products' table。我看过一些教程提到创建“AWS Lambda 应用程序”,然后创建 Lambda 函数,但我认为这对我的使用来说不是必需的。

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = async (event, context, callback) => {

  dynamodb.putItem({
      TableName: "Products",
      Item: {
          "sku": {S: "29574839"},
          "name": {S: "Test Code"}
      }
  }, function(err, data) {
      if (err) {
          console.log(err, err.stack);
          return callback(null, {
              statusCode: '500',
              body: err
          });
      } else {
          return callback(null, {
              statusCode: '200',
              body: 'Adding to table!'
          });
      }
  });

};

我也尝试过使用文档客户端 const docClient = new dynamodb.DocumentClient();,但出现错误:“dynamodb.DocumentClient 不是构造函数”。

我在这里错过了什么?谢谢!

CloudWatch 日志显示(我删除了请求 ID): 函数日志: 开始 RequestId:版本:$LATEST 结束 RequestId: REPORT RequestId:持续时间:491.07 毫秒计费持续时间:500 毫秒内存大小:128 MB 使用的最大内存:87 MB 初始持续时间:405.37 毫秒

由于您使用的是 async handler,我认为问题在于您的函数在处理程序的主体有机会 运行.

之前完成

纠正此问题的一种方法是使用 Promise,如 AWS docs 所示。例如:

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = async (event, context, callback) => {

    const promise = new Promise(function(resolve, reject) {

      dynamodb.putItem({
          TableName: "Products",
          Item: {
              "sku": {S: "29574839"},
              "name": {S: "Test Code"}
          }
      }, function(err, data) {
          if (err) {
              console.log(err, err.stack);
              return callback(null, {
                  statusCode: '500',
                  body: err
              });
          } else {
              return callback(null, {
                  statusCode: '200',
                  body: 'Adding to table!'
              });
          }
      });
  })

  return promise;   
};

以上更改仅供参考,因此可能仍需要进行一些调整。