Лямбда-код узла возвращает null для консоли AWS

#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