【发布时间】:2020-09-25 16:03:21
【问题描述】:
我想将几张图片存储到S3,然后将返回的`imageUrls存储在MongoDB中的express JS fn中。
我所做的就是做到这一点。
module.exports.postController = async (req, res) => {
const files = req.files;
await new Promise((resolve, reject) => {
const imageArr = [];
for (let i = 0; i < files.length; i++) {
var params = {
Bucket: "apple-fiona",
Key: "items" + "/" + Date.now() + "_" + files[i].originalname,
Body: files[i].buffer,
ContentType: files[i].mimetype,
ACL: "public-read",
};
s3bucket.upload(params, async (err, data) => {
if (err) {
res.status(500).json({ errors: [{ message: "Server error" }] });
} else {
imageArr.push(data.Location);
}
});
}
resolve(imageArr);
})
.then((imageArr) => {
console.log(imageArr, "sueecess")
// i want to stroe imageArr to mongodb here...
})
.catch((err) => console.log(err, "er"));
};
我认为console.log 的结果肯定是带有来自data.Location 的imageUrls 的数组,但是我在控制台中得到了像[] 这样的空数组。
resolve() 不是承诺要等到一切都完成后再去吗?
promise 有时非常棘手
我也像这样使用await
const imageArr = [];
for (let i = 0; i < files.length; i++) {
console.log("files i");
console.log(files[i]);
var params = {
Bucket: "apple-fiona",
Key: "items" + "/" + Date.now() + "_" + files[i].originalname,
Body: files[i].buffer,
ContentType: files[i].mimetype,
ACL: "public-read",
};
await s3bucket.upload(params, async (err, data) => {
if (err) {
res.status(500).json({ errors: [{ message: "Server error" }] });
} else {
console.log("run", data.Location);
imageArr.push(data.Location);
};
})
}
console.log(imageArr)
但给了我同样的结果。 我怎样才能做到这一点?
【问题讨论】:
-
恐怕不行......因为在for循环中上传的所有文件都必须在转到then()之前完成。
-
这个答案展示了如何在相同的上下文中使用 async/await stackoverflow.com/a/55012698/747834
标签: javascript node.js amazon-web-services express amazon-s3