node.js - 节点程序总是在 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 - 使 VueJS 数据对 Node 应用程序输出做出反应
- node.js - 节点 js express 无法解析节点模块/合并描述符
- android - 迁移到 AndroidX
- sql - 如何使用 SQL 解析引用链接
- javascript - 无法在 react-sortable-hoc 的一列中移动卡片
- java - 使用 Java 和 Bouncy Castle 进行 Rijndael 256 加密
- tsql - TSQL 根据表 B 中是否存在特定记录来填充表 A 中的布尔值
- javascript - 使用 Strapi CMS 作为管理面板
- node.js - Windows 10:npm WARN tar ENOENT
- node.js - 如何在 AWS 中读取 SQS 的标签?