Search code examples
node.jsfile-uploadmulter

Node.js Multer with Imagemin for file compression


This is my code :

const imagemin=require('imagemin');
const imageminMozjpeg = require('imagemin-mozjpeg');
const multer=require('multer');
const upload=multer({storage:storage});
var imageUpload=upload.single('file');
var storage=multer.diskStorage(
{
    destination:function(req,file,cb) 
    {
        cb(null,'./tempuploads/')
    },
    filename:function(req, file, cb) 
    {
        cb(null,file.originalname)
    }
});
exports.filecompressor=async(req,res)=>
{
    imageUpload(req, res, function(err) 
    {
        let filetoupload=req.file;
        let filename=filetoupload.originalname;
        if(err)
        {
            console.log(err)
        }
        let temppath="./tempuploads/"+filename;
        imagemin([temppath],
        {
            destination: './cachedimages/',
            plugins:[imageminMozjpeg({quality: 50})]
        }).then(result=>
        {
            console.log(result)
        });
    });
};

I want imageUpload(req, res, function(err){}); to return temppath so that I can use imagemin() function outside it and add await to it.

Can anybody please help me??


Solution

  • You can convert imageUpload callback to a promise, for example:

    exports.filecompressor = async (req, res) => {
      return new Promise((resolve, reject) => {
        imageUpload(req, res, function (err) {
          let filetoupload = req.file;
          let filename = filetoupload.originalname;
          if (err) {
            console.log(err);
            return reject(err);
          }
          let temppath = "./tempuploads/" + filename;
          resolve(temppath);
        });
      });
    };