AWS Lambda และ DynamoDB Null Response

Sep 16 2020

ฉันกำลังพยายามเขียนลงในตาราง DynamoDB จากฟังก์ชัน Lambda เมื่อฉันทดสอบการเรียกใช้ฟังก์ชันฟังก์ชันนี้จะส่งกลับค่าว่างโดยไม่มีข้อความแสดงข้อผิดพลาดและไม่มีการเขียนอะไรลงในตาราง ฟังก์ชั่นอยู่ด้านล่าง ฉันได้ตั้งค่าบทบาทบริการสำหรับฟังก์ชันนี้แล้วด้วยนโยบายสิทธิ์ที่อนุญาตให้เข้าถึงตาราง 'ผลิตภัณฑ์' ฉันเคยเห็นบทแนะนำบางอย่างกล่าวถึงการสร้าง "แอปพลิเคชัน 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 (ฉันลบรหัสคำขอออก): บันทึกฟังก์ชัน: เริ่มต้นคำขอรหัส: เวอร์ชัน: $ LATEST END RequestId: REPORT RequestId: Duration: 491.07 ms Billed Duration: 500 ms ขนาดหน่วยความจำ: 128 MB หน่วยความจำสูงสุดที่ใช้: 87 MB ระยะเวลาเริ่มต้น: 405.37 มิลลิวินาที

คำตอบ

2 Marcin Sep 16 2020 at 06:15

เนื่องจากคุณใช้ตัวจัดการ asyncฉันคิดว่าปัญหาคือฟังก์ชันของคุณจะเสร็จสมบูรณ์ก่อนที่ร่างกายของตัวจัดการจะมีโอกาสทำงาน

วิธีหนึ่งที่จะแก้ไขเรื่องนี้ก็คือการใช้ของPromiseตามที่ปรากฏในเอกสาร AWS ตัวอย่างเช่น:

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

การเปลี่ยนแปลงข้างต้นเป็นเพียงตัวอย่างเท่านั้นดังนั้นอาจต้องมีการปรับเปลี่ยนบางอย่าง