首页 > 解决方案 > 节点程序总是在 process.on('SIGINT') 中的任务完成之前退出

问题描述

我试图让我的 Node 程序优雅地退出Ctrl+C,但在程序退出之前任务永远不会完成。

index.js:

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://' + process.env.MONGO_USER_DEV + ':' + 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)
})

清理.js:

const mongoose = require('mongoose')

module.exports = (browser) => {
  mongoose.disconnect()
    .then(res => {
      browser.close()
        .then(res => {
          return
        })
    })
}

标签: node.js

解决方案


通常,文档声明您不应该在清理中执行异步任务......但是您可以在这个冗长的重复帖子中找到一个黑客。 在 node.js 退出之前执行清理操作。希望能帮助到你。


推荐阅读