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:
- gunakan MULTER untuk mengunggah array 10 gambar ke direktori
UPLOADS/IMAGES
. - UNTUK SETIAP file dalam array gunakan SHARP untuk mengompresi file dan menyimpan file
.jpeg
terkompresi baru ke direktoriUPLOADS/COMPRESSED
.
KEMUDIAN
- gunakan
fsPromises.readFile
untuk membaca gambar yang baru dikompresi di direktoriUPLOADS/COMPRESSED
.
KEMUDIAN
- buat sebuah objek :
const toInsertImgData = { data: result, contentType: "image/jpeg"};
dan dorong ke dalam array bernamaimgArray
. Di siniresult
adalah data biner yang dibaca pada langkah sebelumnya.
KEMUDIAN
- gunakan
fsPromises.unlink
untuk menghapus semua file diUPLOADS/IMAGES
danUPLOADS/COMPRESSED
KEMUDIAN
- Gunakan
imgArray
untuk membuat dokumen untuk disimpan diposts
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);
});
});