Node.js 在Lambda节点中为循环使用承诺
我正在尝试用记录预加载DynamoDB表。我有大约1500张唱片要做。我尝试了各种方法,只循环5次,但每次只输入一次。这是我到目前为止所拥有的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
“严格使用”;
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");
};