Search code examples
javascriptnode.jsasync-awaitpm2pdfmake

Async/await function not awaiting after creating write stream


I have a node app that uses express for routing and pdfmake npm for generating a pdf document. On the click of a button, I make an http request that retrieves data from a database, generates a pdf document, and saves to disk. However, my async/await functions only seem to work before I create a write stream using fs.createWriteStream(path). All async/awaits after that seem to be ignored. Also, this only happens on a prod server. When debugging my app locally, ALL async/await functions seem to work. Any ideas as to why this could be happening?

Express route:

router.patch('/:id(\\d+)/approve', async function (req, res) {
    try {
        let id = req.params.id

        const invoice = await db.fetchInvoiceById(id)

        const harvestInvoice = await harvest.getInvoiceById(invoice.harvest_id)

        // generate invoice pdf
        await pdf.generateInvoice(invoice, harvestInvoice)

        res.status(200).json({ id: id })
    } catch (error) {
        res.status(400).json({ error: 'something went wrong' })
    }
})

Functions:

async function SLEEP5() {
  await new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('DONE');
    }, 5000);
  });
}

function test(doc, invoicePath) {
  return new Promise((resolve, reject) => {
    const writeStream = fs.createWriteStream(invoicePath)

    writeStream.on("finish", () => { resolve(true) })
    writeStream.on("error", () => { reject(false) })

    doc.pipe(writeStream)
    doc.end()
  })
}

exports.generateInvoice = async function generateInvoice(invoice, harvestInvoice) {
    const invoicePath = `${__dirname}\\invoice_${invoice.number}.pdf`

    let printer = new PdfPrinter(fonts)
    let def = { // pdf defined here }

    // generate invoice PDF
    let doc = printer.createPdfKitDocument(def, {})

    await SLEEP5() // THIS IS AWAITED

    await test(doc, invoicePath)

    await SLEEP5() // THIS IS NOT AWAITED FOR SOME REASON
}

I am using PM2 to run this node app on an aws ec2 server and Im using version 0.2.4 of pdfmake


Solution

  • I figured out what my issue was. It turns out that I was using pm2 start appName --watch to run my app. I was writing the pdf to a directory within the app. PM2 was detecting a change when the the pdf was being written and would restart the app (because of the --watch flag), causing all the issues i was seeing.