#node.js #amazon-web-services #aws-lambda #amazon-dynamodb #es6-promise
#node.js #amazon-веб-сервисы #aws-lambda #amazon-dynamodb #es6-обещание
Вопрос:
Следующий код отлично работает локально, но после его развертывания в AWS Lambda и запуска мои записи не сохраняются в DynamoDB, и я получаю возврат null
из Lambda.
Я знаю, что это не проблема с разрешениями для роли выполнения Lambda, потому что я могу успешно вставить одну отдельную запись в DynamoDB с консоли AWS.
Я думаю, что проблема связана с .forEach
циклом и тем, как aws-sdk
работает. Я не уверен, что полностью понимаю, как правильно использовать JavaScript promises с Lambda. Любая помощь приветствуется!
module.exports.handler = async event => {
const getItems = () => {... // return items //...}
const addToDb = (items) => {
items.forEach(item => {
var params = {
Item: {"id": {S: item.id}, "title": {S: item.title}},
ReturnConsumedCapacity: "TOTAL",
TableName: "my-table"
};
dynamodb.putItem(params, (err, data) => {
if (err) console.log(err, err.stack);
else console.log(data);
});
});
};
const getItemsPromise = new Promise((resolve) => {
const items = getItems();
const itemsAddedToDb = addToDb(items);
resolve(itemsAddedToDb);
});
return getItemsPromise
.catch(err => console.log(err));
};
Комментарии:
1.
lambda
Не работает или сталкивается с проблемой в целомasync
await
? мой ответ может помочь, еслиlambda
не запущен2. @RanjeetEppakayala лямбда-код запущен. Нет разницы между
exports.handler
иmodule.exports.handler
. Я думаю, что это должно выполнить.forEach
цикл и обещание, которое приходит дляdynamodb.putItem
. Не уверен, следует ли мне использовать async / await и как это работает с promises.3. о! верно,
async
не поддерживаетforEach
. попробуйтеfor loop
.4. Перечислите,
functions
какие этоpromises
. это даст четкое представление.5.Обновлен ответ. это должно устранить
async
await
проблему
Ответ №1:
Это должно сработать!
exports.handler = (event) => {
const getItems = () => {...} // assuming getItems returns promise
const addToDb = (items) => {
asyncForEach(items, async (item) => {
const params = {
Item: {
id: {
S: item.id
},
title: {
S: item.title
}
},
ReturnConsumedCapacity: 'TOTAL',
TableName: 'my-table'
}
await dynamodb.putItem(params, (err, data) => {
if (err) console.log(err, err.stack)
else console.log(data)
})
})
}
const getItemsPromise = new Promise(async (resolve) => { // rule eslintno-async-promise-executor - use then instead
const items = await getItems()
const itemsAddedToDb = await addToDb(items)
resolve(itemsAddedToDb)
})
const asyncForEach = async (array, callback) => {
for (let index = 0; index < array.length; index ) {
await callback(array[index], index, array)
}
}
return getItemsPromise.catch((err) => console.log(err))
}
УВЕДОМЛЕНИЕ:
async
для export.handler
не имеет смысла. используйте, async
только если function
имеет await
внутри него.
async
await
вместо этого не поддерживается forEach
try for loop