在异步代码返回空数组后在数组中推送对象,但控制台日志打印对象



我正在尝试将一个Object推送到Array。CSV流被传递给parseCSV函数,CSVStream是从GetObjectCommand aws-sdk/client-s3接收的流。

ParseCSV函数逐行读取CSV,调用DynamoDB并获取一个属性,将新属性添加到数据对象并将数据推送到结果数组。

问题是,当试图将数据推送到结果数组时,它返回了空数组,但console.log语句逐行返回了行的完整对象
此外,在终端中,首先打印数组,然后打印控制台语句。即使在使用aysnc之后,我也无法理解为什么我会遇到它。

终端输出:

[ ] 
{
name: "john",
UserID: "1",
URI: "4534asas8as8as/sample.doc"
}

const parseCSV = (stream, ID1, ID2) => {
return new Promise((resolve, reject) => {
let results = [];
stream
.pipe(csv())
.on('data', async (data) => {
const {ID3, ID4} = data;
const URI = await DDBDocumentClient.send(
new GetCommand({
TableName: process.env.DB,
Key: {
PK: `ORGID${ID1}#USERID${ID2}`,
SK: `PRODUCTID${ID3}#BATCHID${ID4}`,
},
AttributesToGet: ['URI'],
})
);
data.URI = URI.Item.URI;
console.log(data);
results.push(data);
})
.on('error', (err) => reject(err))
.on('end', async () => resolve(results));
});
};

我看了一些与之相关的答案,但无法理解。请帮帮我,我做错了什么。

您的stream进程在DDBDocumentClient.send完成之前触发end,因此new Promise(使用空数组进行解析。

只需先从流中读取数据,然后在dynamoDB 上查询

const parseCSV = async (stream, ID1, ID2) => { // become async function
// get user from csv
const users = new Promise((resolve, reject) => {
const result = [];
stream
.pipe(csv())
.on('data', async (data) => {
result.push(data);
})
.on('error', reject)
.on('end', () => resolve(result));
});
const uriUsers = [];
for (const user of users) {
const { ID3, ID4 } = user; // Are you sure ID3, ID4 are existed???
const { Item } = await DDBDocumentClient.send(
new GetCommand({
TableName: process.env.DB,
Key: {
PK: `ORGID${ID1}#USERID${ID2}`,
SK: `PRODUCTID${ID3}#BATCHID${ID4}`,
},
AttributesToGet: ['URI'],
})
);
uriUsers.push({
...user,
URI: Item.URL,
});
}
console.log(uriUsers);
return uriUsers;
}

最新更新