gpt4 book ai didi

node.js - 网络请求后 Node 应用程序不会终止?

转载 作者:搜寻专家 更新时间:2023-11-01 00:25:00 24 4
gpt4 key购买 nike

我正在从文本文件中读取 ID 并发出一些 RESTful 请求。它可以工作,但是当所有 ID 都已运行时, Node 应用程序会保持运行。

主要.js:

var fs = require('fs');
var http = require('http');

var ids = fs.readFileSync('test.txt', { encoding: 'utf8' });
ids = ids.split('\n');
var options = {
hostname: 'internalhost',
port: 80,
path: '',
method: 'DELETE'
};
for (var i = 0; i < ids.length; i++) {
options.path = '/thing/' + ids[i];
console.log('Deleting thing ' + ids[i]);

var req = http.request(options, function(res) {
console.log('Status: ' + res.statusCode);
});

req.on('error', function(e) {
console.log('Problem with request: ' + e.message);
});

req.end();
}

请求已成功发出,但在最后一个请求之后,应用程序继续运行。我尝试在打印响应的状态代码后立即添加 res.end(),但随后出现错误,提示 res 没有方法 结束

这是怎么回事?

最佳答案

看来你是 suffering from a side-effect of HTTP keep-alives .当有 TCP 连接打开时 Node 不退出,HTTP Agent让 TCP 连接无限期打开。

您已经提到 keep-alives 对您有益,因此您的选择是有限的。

  • 简单地禁用 Agent 将导致 keep-alives 被禁用,所以这不是一个真正的选择。

  • 您可以手动管理和跟踪您的请求,当所有请求完成后,调用 process.exit。然而,我不喜欢这个,因为它是一种相当生硬的乐器。如果您有其他异步操作正在运行(例如数据库调用),您可能会在这些操作完成之前意外结束您的应用。

  • 您可以手动管理和跟踪您的请求。完成所有操作后,您可以遍历 Agent 实例的 sockets 属性并关闭所有延迟套接字。 (警告:calling close on an already closed socket throws。)

    这是一种更安全的方法,因为其他未完成的操作将被允许在应用退出之前完成。

  • 您可以升级到 node ≥ 0.11.4。 (实际上,您可能想等到 0.12 稳定版发布。)下一个 Node 版本有一个 greatly improved Agent implementation。那unref s 空闲套接字保存在 Agent 的连接池中。换句话说,如果唯一打开的 TCP 连接是那些被保留以作为保持事件连接重用的连接,则 Node 可以退出。

  • 你也可以去掉 new Agent implemention来自不稳定的分支并将其用于您应用程序的请求,而不是您的 Node 版本提供的默认 Agent(我可能会这样做。)

关于node.js - 网络请求后 Node 应用程序不会终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23701176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com