首页 > 解决方案 > AWS Lambda async/await forEach(不是每个项目)

问题描述

我已经坚持了几个小时了,不明白为什么这个简单的异步函数返回一个空数组?我正在尝试使用 Lambda 函数从我的 DynamoDB 表中查询一些项目,但我无法使用 async/await 让函数暂停,我不明白为什么。我已经记录了推送,并且数组中充满了可爱的对象,但它只是在调用完成之前并没有等待它完成。请。帮助。快要疯了。

'use strict';

const AWS = require('aws-sdk');

const docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async(event, context, callback) => {

    const done = (err, res) => {

        const response = {
            statusCode: err ? '400' : '200',
            body: err ? JSON.stringify(err) : JSON.stringify(res),
            headers: {
                'Access-Control-Allow-Origin': '*'
            }
        };

        callback(null, response);

    };

    const { body } = event;

    // If in prod env, parse

    if (typeof body === 'string') {
        body = JSON.parse(body);
    }

    const groupIds = body.groupIds;

    let events = [];

    await groupIds.forEach(groupId => docClient.query({
        TableName: 'events',
        IndexName: 'groupId-creationDate-index',
        KeyConditionExpression: 'groupId = :g',
        ExpressionAttributeValues: { ':g': groupId }
    }, (err, data) => {
        if (err) {
            done(err);
        }
        else {
            events.push(...data.Items);
        }
    }));
    done(null, events);
};

标签: amazon-web-servicesasynchronousaws-lambdaamazon-dynamodb

解决方案


这不是 AWS Lambda 的问题,而是您需要异步并等待更深入地了解 AWS 调用的一般 Javascript 问题。

有效地,虽然你有两个问题,

  • 您需要异步实际的 AWS 调用(使其返回一个承诺)。您可以在此博客文章中看到有关 AWS 开发工具包和async/的一个很好的示例。await
  • Array.prototype.forEach不是一种async方法(插入关于节点事件总线 yadda yadda 的注释) 可以在此处找到关于此的体面的文章。

你可以尝试这样的事情:

//Copied from https://codeburst.io/javascript-async-await-with-foreach-b6ba62bbf404
async function asyncForEach(array, callback) {
  for (let index = 0; index < array.length; index++) {
    await callback(array[index], index, array)
  }
}

asyncForEach(
    groupIds, 
    groupId => 
        await docClient.query({ ExpressionAttributeValues: { ':g': groupId }, ...params })
            .promise()
)

话虽如此,我建议你使用类似节点模块的东西async,它可以让你并行获取东西等......并且仍然使用异步和等待。


推荐阅读