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