【问题标题】:AWS Lambda using s3 getObject function and putItem function to insert it into DynamoDB but nothing happensAWS Lambda 使用 s3 getObject 函数和 putItem 函数将其插入 DynamoDB 但没有任何反应
【发布时间】:2020-04-23 07:54:53
【问题描述】:

这是 node.js 代码:

'use strict';

const AWS = require("aws-sdk");

AWS.config.update({
    region: 'eu-west-1'});

const docClient = new AWS.DynamoDB.DocumentClient();

const tableName = 'Fair';

const s3 = new AWS.S3();

exports.handler = async (event) => {
    var getParams = {
        Bucket: 'dataforfair', //s3 bucket name
        Key: 'fairData.json' //s3 file location
    }
    
    const data = await s3.getObject(getParams).promise()
    .then( (data) => {
        //parse JSON 
        let fairInformations = JSON.parse(data.Body.toString());

        fairInformations.forEach(function(fairInformationEntry) {
            console.log(fairInformationEntry);
            var params = {
                TableName: tableName,
                Item: {
                    "year": fairInformationEntry.year,
                    "fairName":  fairInformationEntry.fairName,
                    "info": fairInformationEntry.info
                }
            };
        
            docClient.put(params, function(err, data) {
                console.log('*****test');
            if (err) {
                console.error("Unable to add fairInformation", fairInformationEntry.fairName, ". Error JSON:", JSON.stringify(err, null, 2));
            } else {
                console.log("PutItem succeeded:", fairInformationEntry.fairName);
            }
            });
        });
       })
       .catch((err) => {
           console.log(err);
       });
      

    const response = {
        statusCode: 200,
        body: JSON.stringify(data),
    };
    return response;
};

大家好,

我想在从 s3 Bucket 获取 JSON 文件后将数据放入 Dynamo DB。获取 JSON 工作和 console.log(fairInformationEntry);也仍然被触发,但 docClient.put() 永远不会被调用。我没有错误,什么都没有。我不知道出了什么问题以及为什么它不起作用。我拥有正确的 IAM 角色并且可以访问我需要的一切。

我希望你能帮助我!

【问题讨论】:

    标签: node.js amazon-s3 aws-lambda amazon-dynamodb alexa-skills-kit


    【解决方案1】:

    问题是promise、callback 和async/await 的混淆。您还尝试在 foreach 中执行异步操作。代码应该是这样的

    "use strict";
    
    const AWS = require("aws-sdk");
    
    AWS.config.update({
      region: "eu-west-1"
    });
    
    const docClient = new AWS.DynamoDB.DocumentClient();
    
    const tableName = "Fair";
    
    const s3 = new AWS.S3();
    
    exports.handler = async event => {
      var getParams = {
        Bucket: "dataforfair", //s3 bucket name
        Key: "fairData.json" //s3 file location
      };
    
      const data = await s3.getObject(getParams).promise();
      //parse JSON
      let fairInformations = JSON.parse(data.Body.toString());
    
      await Promise.all(
        fairInformations.map(fairInformationEntry => {
          console.log(fairInformationEntry);
          var params = {
            TableName: tableName,
            Item: {
              year: fairInformationEntry.year,
              fairName: fairInformationEntry.fairName,
              info: fairInformationEntry.info
            }
          };
          return docClient.put(params).promise();
        })
      );
    
      const response = {
        statusCode: 200,
        body: JSON.stringify(data)
      };
      return response;
    };
    
    

    希望对你有帮助

    【讨论】:

    • 非常感谢!!!现在它正在工作。你也有一些使用 Alexa 编程技能的经验吗?因为我还有另一个问题,我不知道如何解决。
    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 2016-11-15
    • 1970-01-01
    • 2017-03-04
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多