如果主事件循环中还有回调,Node.js脚本将不会退出.虽然可以通过调用process.exit()或抛出异常来强制终止脚本,但建议通过始终进行适当的清理来让脚本"自然地"终止.但是,这有时可能很困难,因为代码中的错误可能会阻止正确的清理,例如,我可能忘记在不再需要时删除IntervalObject等,这最终会阻止程序终止.
因此,有没有办法调试非终止脚本以找出事件循环中剩余的内容?换句话说,Node.js中是否有一种方法可以调试阻止程序退出的内容?
在Node.js的应用我看到的这两种方法的使用process.exit(1)和process.exit(0).任何人都可以给我确切的答案吗?
我的脚本使用promises(使用q库)执行一些异步任务.运行摩卡测试工作正常.但是,从命令行运行脚本则不行.节点进程立即死亡.
var bot = require('./bot');
bot.getCategories().then(function (categories) {
console.log('Found ' + categories.length + ' categories');
});
Run Code Online (Sandbox Code Playgroud) 我有一个节点js进程,它创建一个web3 websocket连接,如下所示:
web3 = new Web3('ws://localhost:7545')
Run Code Online (Sandbox Code Playgroud)
当进程完成时(我发送一个SIGTERM),它不会退出,而是永远挂起而没有控制台输出.
我注册了SIGINT和SIGTERM一个听众在什么处理过程中具有突出以观察process._getActiveRequests()和process._getActiveHandles(),我看到以下内容:
Socket {
connecting: false,
_hadError: false,
_handle:
TCP {
reading: true,
owner: [Circular],
onread: [Function: onread],
onconnection: null,
writeQueueSize: 0 },
<snip>
_peername: { address: '127.0.0.1', family: 'IPv4', port: 7545 },
<snip>
}
Run Code Online (Sandbox Code Playgroud)
为了完整性,这里是监听信号的代码:
async function stop() {
console.log('Shutting down...')
if (process.env.DEBUG) console.log(process._getActiveHandles())
process.exit(0)
}
process.on('SIGTERM', async () => {
console.log('Received SIGTERM')
await stop()
})
process.on('SIGINT', async () => {
console.log('Received SIGINT')
await stop()
})
Run Code Online (Sandbox Code Playgroud)
看起来web3正在打开一个套接字,这是有道理的,因为我从未告诉它关闭连接.通过文档和谷歌搜索,它看起来不像web3对象的close或end方法.
手动关闭stop …
如何在Deno 中通过状态码退出?
在你可以使用的 Node.js 中process.exit(),它的 Deno 对应物是什么?
我一直在阅读文档,但没有明确说明如果没有注册信号处理程序,Node.js 进程是否立即退出。例如,轮询队列中的待处理任务是执行还是所有内容都被删除?程序员是否总是必须通过跟踪所有待处理的承诺来显式处理优雅关闭?
我正在尝试从gulp任务运行“ npm publish”。它有效,但是我想处理npm命令本身引发的任何错误。
如果我执行以下代码:
var cmd = spawnSync('npm.cmd', ['publish', packageDir], { stdio: 'inherit' })
Run Code Online (Sandbox Code Playgroud)
cmd.stdout和cmd.stderr为空。如果我执行
var cmd = spawnSync('npm.cmd', ['publish', packageDir], { stdio: 'pipe' })
Run Code Online (Sandbox Code Playgroud)
cmd.stdout和cmd.stderr是缓冲区,例如 <Buffer 6e 70 6d 20 45 52...
我在这里想念什么?
寻找特殊问题的帮助。每次我停止并重新启动服务器时,都会收到以下消息:
Jim@Jim-PC MINGW64 ~/nodeProjects/express-locallibrary-tutorial
$ npm start
> express-locallibrary-tutorial@0.0.0 start C:\Users\Jim\nodeProjects\express-locallibrary-tutorial
> node ./bin/www
Port 3300 is already in use
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! express-locallibrary-tutorial@0.0.0 start: `node ./bin/www`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the express-locallibrary-tutorial@0.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! …Run Code Online (Sandbox Code Playgroud) 让我先解释一下我所说的“干净地退出”是什么意思。
如果我有一个 nodejs 应用程序并且我执行 setTimeout 很长时间,或者如果我打开一个我没有关闭的套接字连接,那么当我运行该应用程序时它不会退出。原因很清楚,我认为这是一个很好的原因,nodejs 的工作方式是等到“没有更多工作要做”,然后退出。这很好,我喜欢这种操作方式。这也迫使我对干净地关闭套接字和没有计时器放置有点自律。另一件好事。
但是,我遇到的问题是,我收到了一些不符合此规则的代码,并且它没有干净地退出。我怀疑某处的代码留下了一个打开的套接字,但是代码被缩小了,所以找到这个套接字打开的点并不容易。
我的问题是,有没有办法可以查询 nodejs 以找出哪些套接字是打开的?通过查看这样一个带有 ip 号码的列表,我可以开始挖掘以找出打开它们的代码的位置。