Node.js 在Lambda节点中为循环使用承诺

Node.js 在Lambda节点中为循环使用承诺,node.js,aws-lambda,promise,amazon-dynamodb,Node.js,Aws Lambda,Promise,Amazon Dynamodb,我正在尝试用记录预加载DynamoDB表。我有大约1500张唱片要做。我尝试了各种方法,只循环5次,但每次只输入一次。这是我到目前为止所拥有的 “严格使用”; var AWS=require('AWS-sdk'),documentClient=new AWS.DynamoDB.documentClient(); var params={}; exports.handler=函数(事件、ctx、回调){ 我保证( event.map(e=>{ 变量参数={ 项目:{ UID:ctx.awsReq

我正在尝试用记录预加载DynamoDB表。我有大约1500张唱片要做。我尝试了各种方法,只循环5次,但每次只输入一次。这是我到目前为止所拥有的

“严格使用”;
var AWS=require('AWS-sdk'),documentClient=new AWS.DynamoDB.documentClient();
var params={};
exports.handler=函数(事件、ctx、回调){
我保证(
event.map(e=>{
变量参数={
项目:{
UID:ctx.awsRequestId,
AccountName:e.AccountName,
AccountStatus:e.AccountStatus,
MainNumber:e.MainNumber,
传真号码:e.FaxNumber,
紧急编号:即紧急编号,
伊帕佩诺:伊帕佩诺,
BGB:e.BGB,
WebID:e.WebID,
BoxProgram:e.BoxProgram,
报告组:e.ReportGroup,
CreditLimit:e.CreditLimit,
顾客:e.顾客,
运输员:e.运输员,
TSDF:e.TSDF,
许可证:即许可证,
创建的:e.Created,
作者:e.Author,
修改过的,修改过的,
编辑:e.Editor
},
表名:“帐户”
};
documentClient.put(参数、函数(错误、数据){
如果(错误){
控制台日志(err);
}否则{
控制台日志(params);
}
});
})
)。然后(console.log(“完成”);
};您是否尝试过以下方法:

'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]来扩展put过程,每批最多25个

我建议使用
for loop
而不是
map
Promise。所有
都将并行调用多个请求,这可能需要DynamoDB变得有压力

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

参考:


什么在调用这个lambda?或者,事件对象的结构是什么?事件的结构如下:
[{“accountname”:“accountname”,“accountstatus”:“Active”,“mainnumber”:“999-999-999”,“faxnumber”:“emergencynumber”:“epaperno”:“bgb”:0,“webid”:“boxprogram”:“reportgroup”:“creditlimit”:“customer”:0,“运输商”:1,“tsdf”:0,“许可证”:0,“创建”:“1/3/2021 12:02:00下午”,“作者”:“管理员”,“修改”:“1/3/2021 12:02:00下午”,“编辑”:“管理员”}]
'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");
};