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
})
})
}