javascript - 为什么我不能在 .map() 之外填充数组
问题描述
我已经尝试了两天来解决这个问题,现在我只是在循环编码。所有数据都得到处理,但我无法从 .map 函数之外的 s3.upload 函数返回数据。我错过了什么?
if (req.files['altImage']) {
let result = '';
let dataArr = new Array();
const fileArr = req.files['altImage'];
fileArr.map(async file => {
const fileName = file.filename;
const filePath = file.path;
const stream = fs.createReadStream(filePath);
const params = {
ACL: 'public-read',
Bucket: process.env.AWS_S3_BUCKET,
Body: stream,
Key: `${folder}/${fileName}`,
};
const s3Upload = s3.upload(params).promise()
s3Upload
.then(async () => {
await fs.unlinkSync(filePath);
result = await Promise.resolve(s3Upload);
// returns the exact data I need
console.log('result', result);
await dataArr.push(result);
})
.catch((err) => {
console.log(err);
});
})
console.log('dataArr', dataArr);
// dataArr is empty
return {message: 'uploaded', data: dataArr};
}
});
解决方案
这可能是修复代码的最快方法:
if (req.files['altImage']) {
let result = '';
const fileArr = req.files['altImage'];
const requests = fileArr.map(file => {
const fileName = file.filename;
const filePath = file.path;
const stream = fs.createReadStream(filePath);
const params = {
ACL: 'public-read',
Bucket: process.env.AWS_S3_BUCKET,
Body: stream,
Key: `${folder}/${fileName}`,
};
return s3.upload(params).promise()
.then(async result => {
await fs.unlinkSync(filePath));
return result;
})
.catch((err) => {
console.log(err);
});
});
Promise.all(requests).then(dataArr => res.send({
message: 'uploaded',
data: dataArr
}));
}
说明:你是dataArr
异步填充的(因为s3请求是异步的),所以需要等待请求结束后再返回。
此外,使用 Express.js,您不只是返回结果,而是将其传递给res
表示响应的对象。
推荐阅读
- python - GeeksForGeeks 问题上的快速排序算法
- mongodb - 如何使用 mongo-scala-driver 在查询中复制此 mongodb 正则表达式?
- c - 无法在 lldb 中使用断点和其他功能
- elasticsearch - Elasticsearch Range 大于或字段不存在
- r - 如何在 R 中使用“组”创建分段图表
- android - 如何对齐由 onTouchListener 移动的视图
- python - MongoDB 数据库未从 ThreadPoolExecutor 后台线程更新
- keyboard - 我的稳定器不适合我的 pcb,即使它应该是
- html - 有没有办法改变 Pandoc 在 Markdown 文档中解析 HTML 的方式?
- go - 如何通过 Go 应用在 K8s 中连接 mongodb