The*_*der 46
我刚刚解决了这个问题.
刚刚使用的问题process.exit()是我正在处理的程序是创建句柄,但从不破坏它们.
它正在处理目录并将数据放入orientdb.
所以我要学习的一些事情是在删除引用之前需要关闭数据库连接.这process.exit()并不能解决所有情况.
当我的项目处理了2,000个文件.它会下降到大约500左右,额外的句柄将填满可用的工作内存.这意味着它无法继续.因此永远不会到达process.exit最后.
另一方面,如果您关闭请求应用程序保持打开状态的项目,则可以从源头解决问题.
我能够使用的两个"无证函数"是
process._getActiveHandles();
process._getActiveRequests();
Run Code Online (Sandbox Code Playgroud)
我不确定其他哪些函数可以帮助调试这些类型的问题,但这些都很惊人.
它们返回一个数组,您可以使用这些方法确定流程中发生的事情.
我只是希望能帮助其他人绊倒这篇文章.
awi*_*der 26
通过电话,你必须在完成后告诉它
process.exit();
Run Code Online (Sandbox Code Playgroud)
更具体地说,您需要在async.waterfall()(该函数的第二个参数)的回调中调用它.此时,所有异步代码都已执行,您的脚本应该已准备好退出.
编辑:正如下面@Aaron所指出的,这可能与数据库连接处于活动状态,并且不允许节点进程结束有关.
您可以使用节点模块why-is-node-running:
1)运行 npm install -D why-is-node-running
2)添加import * as log from 'why-is-node-running';您的代码
3)当您希望程序退出时,添加一条日志语句:
afterAll(async () => {
await app.close();
log();
}
Run Code Online (Sandbox Code Playgroud)
这将打印带有堆栈跟踪的打开句柄列表,以找出它们的起源:
There are 5 handle(s) keeping the process running
# Timeout
/home/maf/dev/node_modules/why-is-node-running/example.js:6 - setInterval(function () {}, 1000)
/home/maf/dev/node_modules/why-is-node-running/example.js:10 - createServer()
# TCPSERVERWRAP
/home/maf/dev/node_modules/why-is-node-running/example.js:7 - server.listen(0)
/home/maf/dev/node_modules/why-is-node-running/example.js:10 - createServer()
Run Code Online (Sandbox Code Playgroud)
如果您使用 Visual Studio 代码,则可以直接从它附加到已经运行的 Node 脚本。
\n\n首先,运行“调试:附加到节点进程”命令:
\n\n\n\n当您调用该命令时,VS Code 将提示您附加到哪个 Node.js 进程:
\n\n\n\n您的终端应显示此消息:
\n\nDebugger listening on ws://127.0.0.1:9229/<...>\nFor help, see: https://nodejs.org/en/docs/inspector\nDebugger attached.\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n然后,在调试控制台内,您可以使用The Lazy Coder\xe2\x80\x99s 答案中的代码:
\n\nprocess._getActiveHandles();\nprocess._getActiveRequests();\nRun Code Online (Sandbox Code Playgroud)\n\n\n