Unggah gambar ke MongoDB setelah mengompresi dan menghapus gambar dari direktori unggahan Multer

Saya sangat baru dalam pekerjaan terkait pengembangan. MOHON BANTUAN

Saya mencoba mengunggah 10 gambar yang diambil dari pengguna (diimplementasikan melalui MULTER) ke database mongoDB tetapi, sebelum pengunggahan akhir saya ingin mengompresi gambar menggunakan SHARP.

Saya mencoba melakukan ini menggunakan panggilan balik. Tapi GAGAL.

Inilah yang ingin saya lakukan:

  1. gunakan MULTER untuk mengunggah array 10 gambar ke direktori UPLOADS/IMAGES.
  2. UNTUK SETIAP file dalam array gunakan SHARP untuk mengompresi file dan menyimpan file .jpeg terkompresi baru ke direktori UPLOADS/COMPRESSED.

KEMUDIAN

  1. gunakan fsPromises.readFile untuk membaca gambar yang baru dikompresi di direktori UPLOADS/COMPRESSED.

KEMUDIAN

  1. buat sebuah objek : const toInsertImgData = { data: result, contentType: "image/jpeg"};
    dan dorong ke dalam array bernama imgArray. Di sini result adalah data biner yang dibaca pada langkah sebelumnya.

KEMUDIAN

  1. gunakan fsPromises.unlink untuk menghapus semua file di UPLOADS/IMAGES dan UPLOADS/COMPRESSED

KEMUDIAN

  1. Gunakan imgArray untuk membuat dokumen untuk disimpan di posts koleksi Database.

Saat ini setiap kali imgArray kosong ketika saya ingin menggunakannya di akhir. Saya tahu bahwa PROMISES atau AYSNC/AWAIT dapat membantu. Tapi saya tidak yakin bagaimana menerapkannya. Tolong bantu .

TERIMA KASIH JIKA ANDA TELAH MEMBACA SEJAUH INI


Ini kode saya:

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);
    });
});

person dewesh jha    schedule 06.08.2020    source sumber


Jawaban (1)


di dalam untuk setiap , Anda menggunakan panggilan async, yang berarti semua .then() dijamin akan dieksekusi sebelum .forEach berakhir, sehingga array janji bisa menjadi ambigu. Salah satu perbaikan yang mudah adalah dengan menggunakan fs.promises inside.then() dan tidak memaksakan janji.

person AnonyMouze    schedule 06.08.2020