Thursday, 8 June 2017

Promises not working as expected in my Node JS app

I am facing some confusion as to how my promises are working in my node.js web application.

  let arrayPics = [];
        let conv = ()=>{
            return new Promise((resolve,reject)=>{
                let check=converter.convert(req);
                if(check)
                    resolve('Conversion');
                else
                    reject();
            });
        };

        let enc = (message)=>{
            return new Promise((resolve,reject)=>{
               let check =  encode.encoder(arrayPics);
               if(check)
                   resolve(message + ' and Encoding to Base 64!');
                else
                    reject();
            });
        };

        conv().then((result)=>{
            return enc(result);
        }).then((result)=>{
            console.log('Finished '+result);
            console.log(arrayPics[4]);
            return res.redirect('/ViewDoc');
        });

So basically my first promise is running a script to convert pdf and tiff file documents to seperate png files in a temp folder. Then the second promise runs a script to convert the pngs to base 64 and store it in a dynamic array. When I consume the promises I get the output as something like this :

{ title: '' }
{ fieldname: 'upl',
  originalname: 'multipage_tiff_example.tif',
  encoding: '7bit',
  mimetype: 'image/tiff',
  destination: 'uploads/',
  filename: 'multipage_tiff_example.tif',
  path: 'uploads\\multipage_tiff_example.tif',
  size: 810405 }
Finished Conversion and Encoding to Base 64!
undefined
POST / 302 181.742 ms - 60
GET /ViewDoc 304 8.564 ms - -
Converted!

We can see that the console.log(arrayPics[4]) output is coming out as undefined. But when i run the same code while debugging my code I get the following output.

Debugger listening on [::]:54395
Server is listening on: 3000
GET / 304 35.525 ms - -
{ title: '' }
{ fieldname: 'upl',
  originalname: 'multipage_tiff_example.tif',
  encoding: '7bit',
  mimetype: 'image/tiff',
  destination: 'uploads/',
  filename: 'multipage_tiff_example.tif',
  path: 'uploads\\multipage_tiff_example.tif',
  size: 810405 }
Finished Conversion and Encoding to Base 64!
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAIAAAAVFBUnAAAABGdBTUEAAL.......
Converted!

We can see that now we get an output for console.log(arrayPics[4]). This is the part where I am getting confused as to why my code is behaving like that. I have also posted my scripts that my promises are using for your reference:

DOCUMENT CONVERTER SCRIPT:

module.exports = {

    convert: function pdfConverter(req)
    {   let check = true;
        gm(req.file.path).write('Images/output.png', (err)=>
        {
            if(err)
            {
                console.log(err);
                reject(err);
                check = false;
            }

            else
            {
                console.log("Converted!");

            }

        });
        return check;
    }

};

BASE64 ENCODING

module.exports = {
    encoder: function base64_encoder(arrayPics)
            {
                let files = fs.readdirSync('Images/');
                for(let i in files)
                {
                    //console.log('C');
                    arrayPics.push(base64Img.base64Sync('Images/output-' + i + ".png"));
                }
                return true;
            }
};

I would be grateful if i can get some suggestions as to why this is happening and any changes that I can make to my code.



via Vmal

No comments:

Post a Comment