在 Lambda 节点中使用 promises for 循环

Using promises in a Lambda node for loop

我正在尝试使用记录预加载 DynamoDB table。我有大约 1500 条记录要做。我已经尝试了各种方法来循环遍历 5 个,但每次只输入一个。这是我目前所拥有的。

'use strict';

var AWS = require('aws-sdk'), documentClient = new AWS.DynamoDB.DocumentClient();
var params = {};

exports.handler = function(event, ctx, callback) {
    Promise.all(
        event.map(e => {
            var params = {
                Item: {
                   UID: ctx.awsRequestId,
                   AccountName: e.accountname,
                   AccountStatus: e.accountstatus,
                   MainNumber: e.mainnumber,
                   FaxNumber: e.faxnumber,
                   EmergencyNumber: e.emergencynumber,
                   EPAPERNO: e.epaperno,
                   BGB: e.bgb,
                   WebID: e.webid,
                   BoxProgram: e.boxprogram,
                   ReportGroup: e.reportgroup,
                   CreditLimit: e.creditlimit,
                   Customer: e.customer,
                   Transporter: e.transporter,
                   TSDF: e.tsdf,
                   Permit: e.permit,
                   Created: e.created,
                   Author: e.author,
                   Modified: e.modified,
                   Editor: e.editor
            },
                TableName: 'Accounts'
            };
            documentClient.put(params, function (err, data){
               if(err){
                   console.log(err);
               }else{
                   console.log(params);
               }
           });
        })
    ).then(console.log("Done"));
};

如有任何帮助,我们将不胜感激。

你试过这个吗:

'use strict';

var AWS = require('aws-sdk'), documentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async(event, ctx) => {
    return Promise.all(
        event.map(e => {
            var params = {
                Item: {
                   UID: ctx.awsRequestId,
                   AccountName: e.accountname,
                   AccountStatus: e.accountstatus,
                   MainNumber: e.mainnumber,
                   FaxNumber: e.faxnumber,
                   EmergencyNumber: e.emergencynumber,
                   EPAPERNO: e.epaperno,
                   BGB: e.bgb,
                   WebID: e.webid,
                   BoxProgram: e.boxprogram,
                   ReportGroup: e.reportgroup,
                   CreditLimit: e.creditlimit,
                   Customer: e.customer,
                   Transporter: e.transporter,
                   TSDF: e.tsdf,
                   Permit: e.permit,
                   Created: e.created,
                   Author: e.author,
                   Modified: e.modified,
                   Editor: e.editor
                },
                TableName: 'Accounts'
            };
            documentClient.put(params).promise().then(data=>{
                console.log(params);
            })
        })
    ).then(()=>{
        console.log("Done")
    }).catch(e=>{
        console.log(e)
    })
};

如果您发现问题请告诉我,我还没试过

另一个想法是使用 [BatchWriteItem][1] 批量放置过程,每​​批最多 25 个

我建议使用 for loop 而不是 mapPromise.all 会并行调用许多请求,这可能会使 DynamoDB 变得有压力。

将您的处理函数转换为 async/await 函数,然后等待 dynamodb 进程完成。

参考:

'use strict';

var AWS = require('aws-sdk'), documentClient = new AWS.DynamoDB.DocumentClient();

const insertAccount = async (e) => {
  const params = {
    Item: {
      UID: ctx.awsRequestId,
      AccountName: e.accountname,
      AccountStatus: e.accountstatus,
      MainNumber: e.mainnumber,
      FaxNumber: e.faxnumber,
      EmergencyNumber: e.emergencynumber,
      EPAPERNO: e.epaperno,
      BGB: e.bgb,
      WebID: e.webid,
      BoxProgram: e.boxprogram,
      ReportGroup: e.reportgroup,
      CreditLimit: e.creditlimit,
      Customer: e.customer,
      Transporter: e.transporter,
      TSDF: e.tsdf,
      Permit: e.permit,
      Created: e.created,
      Author: e.author,
      Modified: e.modified,
      Editor: e.editor
    },
    TableName: 'Accounts'
  };
  return documentClient.put(params).promise(); // convert to Promise
}

exports.handler = async (event, ctx) => { // Async function
  for (const item of event) {
    console.log(item);
    await insertAccount(item) // wait until it finish and go to next item
      .catch((error) => {
        console.log(error);
        // throw error; don't care about this error, just continue
      });
  }
  console.log("Done");
};