3 回答

TA贡献1829条经验 获得超7个赞
问题在于竞争条件。它甚至在等待数组被填充之前就返回了。
我认为这个解决方案可能有效。
const send_email = async (data) => {
try {
const data_attachment = await get_S3_files(batch_key);
console.log(data_attachment);
} catch (error) {
console.log(error);
}
};
const get_S3_files = (batch_key) => {
return new Promise((resolve, reject) => {
var params = {
Bucket: S3_bucket,
Delimiter: "",
Prefix: `${batch_key}/`,
};
s3.listObjects(params, async function (err, data) {
var files = [];
if (err) throw err;
if (data.Contents.length) {
await Promise.all(
data.Contents.map((row) => {
return new Promise((resolve, reject) => {
s3.getObject({ Bucket: S3_bucket, Key: row.Key }, (err, data) => {
if (err) return reject(err);
files.push({
filename: data.Body,
content: data.Metadata.file_name,
});
return resolve(data);
});
});
})
);
}
return resolve(files);
});
});
};

TA贡献1815条经验 获得超13个赞
你从错误的地方回来了。您的返回语句在s3.listObjects函数内部。return files;应该在关闭函数之前的下面一行。但是,它无论如何都行不通。你必须承诺这个功能。
const get_S3_files = (data) => {
return new Promise((resolve, reject) => {
var params = {
Bucket: 'name',
Delimiter: '',
Prefix: `${data}/`
}
var files = []
s3.listObjects(params, async function (err, data) {
if (err) throw err;
if (data.Contents.length) {
for (const row of data.Contents) {
await s3.getObject({ Bucket: 'name', Key: row.Key }, function (err, data) {
if (err) {
console.log('S3 Get Object Error', err)
reject(err)
} else {
console.log(data)
files.push({
filename: data.Body,
content: data.Metadata.file_name,
})
}
})
}
}
resolve(files);
});
})
}

TA贡献1802条经验 获得超5个赞
下面的代码片段可能不一定能回答原来的问题,但如果 OP 愿意对其代码进行一些重大更改,那么我认为这个解决方案可以完美运行,而不会影响原来的功能。
const get_S3_files = async (data) => {
var params = {
Bucket: 'name',
Delimiter: '',
Prefix: `${data}/`
}
var files = []
await s3.listObjects(params, async function (err, data) {
if (err) throw err;
if (data.Contents.length) {
for (const row of data.Contents) {
try {
const dataContent = await s3.getObject({ Bucket: 'name', Key: row.Key }).promise();
files.push({
filename: dataContent.Body,
content: dataContent.Metadata.file_name,
})
} catch(err) {
console.log('S3 Get Object Error', err);
}
}
}
return files;
});
}
到处使用回调会使代码不可读。我建议您使用promise()和 s3 sdk 的方法将您的响应转换为 promise。
同样,您可以将listObjects方法转换为承诺。它将使代码更具可读性。
注意:我在代码中添加了一些变量,请确保根据您的代码上下文更改它们。
添加回答
举报