Я работаю над функцией AWS Lambda (Node 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