我使用DocumentClient
扫描DynamoDB表中的所有项-在Lambda函数中。然后循环遍历每个项并提取所需的有效负载。我将在新的查询中使用有效负载中的该项作为ExpressionAttributeValues
的参数。所有内容都可以独立运行。问题是当嵌套在数组forEach中时使用异步函数queryItems
()方法。函数queryItems出现解析错误。在循环外调用该函数时,我可以查询表,但如何单独查询每一项?我不确定如何处理此问题。
'use strict';
const aws = require('aws-sdk');
const docClient = new aws.DynamoDB.DocumentClient();
var paramsAll = {
TableName: 'MyTable',
Select: "ALL_ATTRIBUTES"
};
exports.handler = async (event, context) => {
try {
let arr = [];
let sequence = '';
//scan all items in table
docClient.scan(paramsAll, function(err, data) {
if (err) {
//handle error
}
else {
//Loop through each item in the table:
let items = (data.Items);
items.forEach(function(Item) {
let p = (Item.payload);
//Extract sequence from the payload
sequence = (p.seq);
arr.push(sequence);
//perform other function with this array (not listed for brevity)
});
//Here is where I'm having the issue:
arr.forEach(function(Item) {
//Pass these items as a paramater within queryItems function but getting Parsing Error: unexpected token queryItems
const results = await queryItems(Item);
//do something with the results...
})
}
});
}
catch (err) {
return { error: err };
}
};
async function queryItems(p) {
try {
var params = {
TableName: 'MyTable',
KeyConditionExpression: '#seq = :value',
ExpressionAttributeValues: { ':value': p },
ExpressionAttributeNames: { '#seq': 'seq' }
};
const data = await docClient.query(params).promise();
return data;
}
catch (err) {
return err;
}
}
2条答案
按热度按时间js5cn81o1#
我确实遇到过类似的问题。我认为发生的只是一个Javascript语法问题,在提供给
forEach
的同步函数中await
ingqueryItems
将产生一个错误。(尽管,在运行代码时,我确实得到了特定的错误"SyntaxError: await is only valid in async functions and the top level bodies of modules"
,所以可能还有其他事情发生。)我认为DynamoDB查询没有什么问题,但是hoangdv的建议非常正确。具体来说,我还建议对
scan
使用promise样式,虽然for...loop
肯定可以工作,但使用Promise.all
和map
完成所有查询会快得多。下面是我如何修改代码的:pgccezyw2#
问题是如何在for循环中等待,最好在循环中使用
Promise.all()
和map
来等待:不过,我似乎并不太理解你的逻辑。
1.您扫描了一个名为
MyTable
的表,但没有分页,这意味着您最多只能获得1MB的数据。1.有了结果,你就可以去掉
seq
的值,然后再次读取MyTable
中的每一项,这次使用Query
和seq
作为键。