amazon-web-services - 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);
};
解决方案
这不是 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
,它可以让你并行获取东西等......并且仍然使用异步和等待。