I want my Node program to perform some tasks (eg. closing down the database connection and deleting some objects) before exiting, even when the program is stopped manually (via Ctrl+C or the kill command for example). Is this possible?
I've tried using process.on('exit') and process.on('SIGINT'), but my tasks never finish before the program exits and I'm not sure whether this handles the kill command too:
require('dotenv').config()
const log = require('./middleware/log')
const error = require('./middleware/error')
const mongoose = require('mongoose')
const puppeteer = require('puppeteer')
const cleanup = require('./middleware/cleanup');
(async () => {
  // handle Ctrl+C
  process.on('SIGINT', () => {
    cleanup(browser) // this never finishes before the program ends
    process.exit(2)
  })
  // log program exit
  process.on('exit', (code) => {
    if (code === 2) {
      log('Program exited manually.')
    } else if (code === 1) {
      log('Program crashed.')
    } else {
      log('Program exited.')
    }
    cleanup(browser) // I've tried putting it here too, but it still doesn't finish before the program ends
    process.exit(code)
  })
  await mongoose.connect(
    'mongodb://app:' + process.env.MONGO_PW_DEV + '@' + process.env.MONGO_IP_DEV + ':' + process.env.MONGO_PORT_DEV + '/' + process.env.MONGO_DB_DEV,
    {
      useNewUrlParser: true
    }
  )
  const browser = await puppeteer.launch({ headless: true })
  page = await browser.newPage()
  // do stuff
  cleanup(browser)
})().catch(async (err) => {
  cleanup(browser)
  error(err)
})
Here is my cleanup function:
const mongoose = require('mongoose')
module.exports = (browser) => {
  mongoose.disconnect()
    .then(res => {
      browser.close()
        .then(res => {
          return
        })
    })
}