节点程序总是在进程中的任务之前退出。('SIGINT')可以完成

问题描述 投票:0回答:1

我试图让我的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)
})

cleanup.js:

const mongoose = require('mongoose')

module.exports = (browser) => {
  mongoose.disconnect()
    .then(res => {
      browser.close()
        .then(res => {
          return
        })
    })
}
node.js
1个回答
0
投票

通常,doc指出你不应该在清理中执行异步任务......但是你可以在这个冗长的重复帖子中找到一个hack。 qazxsw poi。希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.