压缩图像并从Multer上传目录中删除图像后,将图像上传到MongoDB

时间:2020-08-06 15:36:56

标签: javascript node.js mongodb es6-promise multer

我对与开发相关的工作非常陌生。 请帮助

我正在尝试将从用户拍摄的10张图像(通过MULTER实现)上传到mongoDB数据库,但是在最终上传之前,我想使用SHARP压缩图像。

我尝试使用回调进行此操作。但是失败了。

这就是我想要做的:

  1. 使用MULTER将10张图片的阵列上传到UPLOADS/IMAGES目录。
  2. 数组中的FOR EACH文件使用SHARP压缩文件并将新的压缩.jpeg文件存储到UPLOADS/COMPRESSED目录。

之后

  1. 使用fsPromises.readFile来读取UPLOADS/COMPRESSED目录中的新压缩图像。

之后

  1. 创建对象:const toInsertImgData = { data: result, contentType: "image/jpeg"};
    并将其推送到名为imgArray的数组中。这里的result是在上一步中读取的二进制数据。

之后

  1. 使用fsPromises.unlink删除UPLOADS/IMAGESUPLOADS/COMPRESSED中的所有文件

之后

  1. 使用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);
    });
});

1 个答案:

答案 0 :(得分:0)

在每个

内,您使用async调用,这意味着所有.then()都必须在.forEach结束之前执行,因此promise数组可能是模棱两可的。 一种简单的解决方法是在.then()内部使用fs.promises而不是将其推送到promises。