AWS Lambda và DynamoDB Null Response

Sep 16 2020

Tôi đang cố gắng ghi vào bảng DynamoDB từ một hàm Lambda. Khi tôi chạy thử hàm, nó trả về null, không có thông báo lỗi và không có gì được ghi vào bảng. Chức năng ở bên dưới. Tôi đã thiết lập vai trò dịch vụ cho chức năng này với chính sách quyền cho phép truy cập vào bảng 'Sản phẩm'. Tôi đã thấy một số hướng dẫn đề cập đến việc tạo "Ứng dụng AWS Lambda", sau đó tạo hàm Lambda, nhưng tôi không nghĩ rằng điều này là cần thiết cho việc sử dụng của tôi.

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!'
          });
      }
  });

};

Tôi cũng đã thử sử dụng ứng dụng khách tài liệu const docClient = new dynamodb.DocumentClient();và tôi gặp lỗi: "dynamicodb.DocumentClient không phải là một phương thức khởi tạo".

Tôi còn thiếu gì ở đây? Cảm ơn!

Nhật ký CloudWatch hiển thị (Tôi đã xóa id yêu cầu): Nhật ký chức năng: START RequestId: Phiên bản: $ LATEST END RequestId: REPORT RequestId: Duration: 491,07 ms Thời lượng lập hóa đơn: 500 ms Dung lượng bộ nhớ: 128 MB Bộ nhớ tối đa được sử dụng: 87 MB Thời lượng sử dụng: 405,37 ms

Trả lời

2 Marcin Sep 16 2020 at 06:15

Vì bạn đang sử dụng trình xử lý không đồng bộ, tôi nghĩ vấn đề là chức năng của bạn hoàn thành trước khi cơ thể của trình xử lý có cơ hội chạy.

Một cách để khắc phục điều này là thông qua việc sử dụng Promisenhư được hiển thị trong tài liệu AWS . Ví dụ:

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;   
};

Những thay đổi trên chỉ là ví dụ, do đó có thể vẫn cần một số điều chỉnh.