Saya sedang mengerjakan fungsi AWS Lambda (Node 4.3) yang perlu menjalankan semua item dalam tabel DynamoDB dan memperbarui atribut tertentu.
Masalah yang saya alami adalah bagaimana membuat Lambda menunggu hingga semua operasi DynamoDB selesai.
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');
}
});
});
};
Saya mencoba menggunakan async.parallel
untuk menunggu semua permintaan db.put
selesai tetapi berakhir dengan kesalahan Process exited before completing request
setiap kali fungsi Lambda berjalan.
Itu memang memperbarui beberapa item DynamoDB tetapi jelas tidak semuanya.
Saya menambahkan beberapa panggilan console.log
ketika ada kesalahan tetapi satu-satunya keluaran yang saya lihat di log adalah ini:
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
Apa cara yang tepat untuk membuat fungsi Lambda menunggu hingga semuanya selesai? (Jumlah datanya tidak besar, jadi saya tidak khawatir akan berjalan lebih dari 5 menit dan kehabisan waktu.)
Process exited before completing request
berarti ada kesalahan lain dalam kode js Anda - apakah ini berfungsi secara lokal, dan hanya kesalahan pada AWS Lambda? - person Bobby Matson   schedule 30.03.2017console.log
? Itu harus datang melalui keluaran log di Lambda - person Bobby Matson   schedule 30.03.2017console.log
ketikadoc.put
mengalami kesalahan tetapi saya tidak melihat satu pun pernyataan itu di log. Saya hanya melihat keluaran dariconsole.log(data.Items.length);
dan sekitar 60 pernyataanFinished put for...
sebelum mati. - person Mark Biek   schedule 30.03.2017async.series
atauPromise.all
dan lihat apakah hasilnya sama. - person Bobby Matson   schedule 30.03.2017async.auto
(atau mungkinwaterfall
) dan melihat apa yang terjadi. Terima kasih untuk bantuannya! - person Mark Biek   schedule 30.03.2017async.series
adalah yang ingin Anda coba. Beri tahu saya bagaimana kelanjutannya! - person Bobby Matson   schedule 30.03.2017async.series
berhasil! Sepertinya Anda benar tentang saya membanjiri DynamoDB dengan terlalu banyak koneksi. Anda harus mempostingnya sebagai jawaban sehingga saya dapat menerimanya dan memberi Anda penghargaan yang pantas. Terima kasih lagi. Saya benar-benar menghabiskan sepanjang hari mencoba memikirkan hal ini. - person Mark Biek   schedule 30.03.2017