我对与开发相关的工作非常陌生。 请帮助
我正在尝试将从用户拍摄的10张图像(通过MULTER实现)上传到mongoDB数据库,但是在最终上传之前,我想使用SHARP压缩图像。
我尝试使用回调进行此操作。但是失败了。
这就是我想要做的:
UPLOADS/IMAGES
目录。.jpeg
文件存储到UPLOADS/COMPRESSED
目录。之后
fsPromises.readFile
来读取UPLOADS/COMPRESSED
目录中的新压缩图像。之后
const toInsertImgData = { data: result, contentType: "image/jpeg"};
imgArray
的数组中。这里的result
是在上一步中读取的二进制数据。之后
fsPromises.unlink
删除UPLOADS/IMAGES
和UPLOADS/COMPRESSED
中的所有文件之后
imgArray
制作要保存在数据库posts
集合中的文档。现在,每次imgArray
为空时,我都想最后使用它。我知道承诺或 AYSNC / AWAIT 可以提供帮助。但是我不确定如何实现它。
请帮忙。
如果您已阅读此书,则表示感谢
这是我的代码:
const promises = [];
app.post("/compose/:id", upload.array("image", 10), (req, res) => {
const id = req.params.id;
const imgArray = [];
const caption = req.body.caption;
const now = new Date();
req.files.forEach((file) => {
const compressedImgPath =__dirname +"/public/uploads/compressed/" +now.getDate() +"-" +(now.getMonth() + 1) +"-" +now.getFullYear() +"-" +now.getTime() +".jpeg";
sharp(file.path)
.resize(640, 480)
.jpeg({
quality: 80,
chromaSubsampling: "4:4:4",
})
.toFile(compressedImgPath)
.then(() => {
fsPromises.readFile(compressedImgPath)
.then((result) => {
const toInsertImgData = {
data: result,
contentType: "image/jpeg",
};
imgArray.push(toInsertImgData);
})
.then(() => {
promises.push(fsPromises.unlink(compressedImgPath));
promises.push(fsPromises.unlink(file.path));
})
.catch((err) => {
console.log(err);
});
});
});
Promise.all(promises)
.then(() => {
User.findById(id, (err, result) => {
if (!err) {
if (imgArray.length > 0) {
console.log("found user:" + id);
const newPost = new Post({
uId: id,
userName: result.name,
timeStamp: "5th August, 2020 at 2:10PM",
caption: caption,
img: imgArray,
});
newPost.save((err) => {
if (!err) {
console.log("post saved in DB");
res.redirect("/users/" + id.toString());
} else {
console.log(err);
}
});
} else {
console.log("array is empty");
}
}
});
})
.catch((err) => {
console.log(err);
});
});
答案 0 :(得分:0)
内,您使用async调用,这意味着所有.then()都必须在.forEach结束之前执行,因此promise数组可能是模棱两可的。 一种简单的解决方法是在.then()内部使用fs.promises而不是将其推送到promises。