Home > front end >  await not working on res.app.render in Express.js
await not working on res.app.render in Express.js

Time:01-21

I want to generate multiple pdf files and attach to the email. But await seems not working on res.app.render.

route.get('/:id/receipts', async function (req, res) {
   ...
   let attachments = [];
   for await(let item of items){
      res.view.item = item;
      console.log(1)
      await res.app.render('pdfs/receipt', res.view, async function(err, html){
         console.log(2)
         if (err) return res.end(err.stack)
         return await pdf.create(html).toBuffer(async function(err, buffer){
            console.log(3)
            attachments.push({
               content: buffer,
               filename: 'receipt.pdf',
           })
         });
      });
   }
   console.log(4)
   ...
})

Expect Result:

1
2
3
4

Actually Result:

1
4
2
3

CodePudding user response:

I think res.app.render is not returning a promise that's why you are facing this issue. You have to make a custom promise. I hope following code will help you.

    oute.get('/:id/receipts', async function (req, res) {
    ...
    let attachments = [];
    for await(let item of items){
    res.view.item = item;
    console.log(1)
    const customPromise = new Promise((resolve, reject) => {
            res.app.render('pdfs/receipt', res.view, async function(err, html){
            console.log(2)
            if (err) { res.end(err.stack);reject()}
            else {
                await pdf.create(html).toBuffer(async function(err, buffer){
                    console.log(3)
                    attachments.push({
                        content: buffer,
                        filename: 'receipt.pdf',
                    })
                });
                resolve();
            }
    });
    })
    }
    console.log(4)
    ...
})
  • Related