ฉันกำลังทำงานกับฟังก์ชัน AWS Lambda (โหนด 4.3) ที่ต้องรันผ่านรายการทั้งหมดในตาราง DynamoDB และอัปเดตคุณลักษณะบางอย่าง
ปัญหาที่ฉันมีคือจะทำให้ Lambda รอจนกว่าการดำเนินการ DynamoDB ทั้งหมดจะเสร็จสิ้นได้อย่างไร
var async = require('async');
var aws = require('aws-sdk');
var doc = new aws.DynamoDB.DocumentClient();
exports.handler = (event, context, callback) => {
doc.scan({
TableName: 'Occupations_dev'
}, function (err, data) {
console.log(data.Items.length);
var funcs = [];
data.Items.forEach(function (item) {
funcs.push(function (cb) {
item.Popularity = 0;
doc.put({
TableName: 'Occupations_dev',
Item: item
}, function (err, data) {
if (err) {
console.log("ERROR: " + item.Name);
cb(err);
} else {
console.log('Finished put for ' + item.Id)
cb(null, item);
}
});
});
});
async.parallel(funcs, function (err, results) {
console.log('Finished');
if (err) {
context.fail(err);
} else {
callback(null, 'Finished');
}
});
});
};
ฉันลองใช้ async.parallel
เพื่อรอให้คำขอ db.put
ทั้งหมดเสร็จสิ้น แต่จบลงด้วยข้อผิดพลาด Process exited before completing request
ทุกครั้งที่ฟังก์ชัน Lambda ทำงาน
โดยจะอัปเดตรายการ DynamoDB บางส่วน แต่ไม่ใช่ทั้งหมดอย่างแน่นอน
ฉันเพิ่มการเรียก console.log
บางส่วนเมื่อมีข้อผิดพลาด แต่ผลลัพธ์เดียวที่ฉันเห็นในบันทึกคือ:
START RequestId: b72fd7c6-14ed-11e7-a95a-c1185af4e870 Version: $LATEST
2017-03-30T02:08:11.691Z b72fd7c6-14ed-11e7-a95a-c1185af4e870 1362
END RequestId: b72fd7c6-14ed-11e7-a95a-c1185af4e870
REPORT RequestId: b72fd7c6-14ed-11e7-a95a-c1185af4e870 Duration: 37165.80 ms Billed Duration: 37200 ms Memory Size: 128 MB Max Memory Used: 128 MB
RequestId: b72fd7c6-14ed-11e7-a95a-c1185af4e870 Process exited before completing request
วิธีที่เหมาะสมในการทำให้ฟังก์ชัน Lambda รอจนกว่าทุกอย่างจะเสร็จสิ้นคืออะไร (ข้อมูลมีไม่มากนัก ดังนั้นฉันจึงไม่กังวลกับการทำงานนานกว่า 5 นาทีและหมดเวลา)
Process exited before completing request
หมายความว่ามีข้อผิดพลาดอื่น ๆ ในโค้ด js ของคุณ - ใช้งานได้ในเครื่องและมีข้อผิดพลาดเฉพาะบน AWS Lambda หรือไม่ - person Bobby Matson   schedule 30.03.2017console.log
ใดๆ หรือไม่ สิ่งเหล่านั้นควรมาจากเอาต์พุตบันทึกใน Lambda - person Bobby Matson   schedule 30.03.2017console.log
บางคำสั่งเมื่อdoc.put
มีข้อผิดพลาด แต่ฉันไม่เห็นบันทึกใด ๆ เลย ฉันเห็นเฉพาะผลลัพธ์ของconsole.log(data.Items.length);
และประมาณ 60 ของคำสั่งFinished put for...
ก่อนที่มันจะตาย - person Mark Biek   schedule 30.03.2017async.series
หรือPromise.all
แล้วดูว่าผลลัพธ์ของคุณเหมือนกันหรือไม่ - person Bobby Matson   schedule 30.03.2017async.auto
(หรืออาจจะwaterfall
) แล้วดูว่าจะเกิดอะไรขึ้น ขอบคุณสำหรับความช่วยเหลือ! - person Mark Biek   schedule 30.03.2017async.series
คือสิ่งที่คุณต้องการลองใช้ แจ้งให้เราทราบว่ามันเป็นอย่างไร! - person Bobby Matson   schedule 30.03.2017async.series
ทำเคล็ดลับ! ดูเหมือนว่าคุณคิดถูกที่ฉันทำให้ DynamoDB มีการเชื่อมต่อมากเกินไป คุณควรโพสต์สิ่งนั้นเป็นคำตอบเพื่อที่ฉันจะได้ยอมรับและให้เครดิตที่เหมาะสมแก่คุณ ขอบคุณอีกครั้ง. ฉันใช้เวลาทั้งวันอย่างแท้จริงในการพยายามคิดหาคำตอบนี้ - person Mark Biek   schedule 30.03.2017