Node.js 为什么可以';在.map()之外填充数组
我花了两天的时间想弄明白这一点,现在我只是在循环编码。 所有的数据都得到了处理,但我无法从.map函数之外的s3.upload函数返回数据。我错过了什么Node.js 为什么可以';在.map()之外填充数组,node.js,amazon-s3,Node.js,Amazon S3,我花了两天的时间想弄明白这一点,现在我只是在循环编码。 所有的数据都得到了处理,但我无法从.map函数之外的s3.upload函数返回数据。我错过了什么 if (req.files['altImage']) { let result = ''; let dataArr = new Array(); const fileArr = req.files['altImage']; fileArr.map(async file => { const f
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
对象。我以为我在等待s3Upload中第一个承诺的响应。无论如何,最后一个承诺首先触发,并在上载4个图像后返回一个空响应-结果[undefined,undefined,undefined,undefined],undefined]然后返回console.log-{消息:“Upload”,数据:Array(0)}。在提交表单之前,我需要来自图像上传的数据来填充Angular客户端中的表单。我以为我在等待s3Upload中第一个承诺的响应。无论如何,最后一个承诺首先触发,并在上载4个图像后返回一个空响应-结果[undefined,undefined,undefined,undefined],undefined]然后返回console.log-{消息:“Upload”,数据:Array(0)}。在提交表单之前,我需要图像上传中的数据来填充Angular client中的表单。我的代码中有错误(对我来说很难,因为我无法测试),你能试试吗?