Nodejs 使用 needle 发起请求时经常遇到 socket hang up 报错

Nodejs 使用 needle 发起请求时经常遇到 socket hang up 报错

这是为啥,

2 回复

问: 为什么使用 http 模块发起 HTTP 客户端请求时,有时候会发生 socket hang up 错误?

答: 发起客户端 HTTP 请求前需要先创建一个客户端。http 模块提供了一个全局客户端 http.globalAgent ,可以让我们使用.request 或.get 方法时不用手动创建客户端。但是全局客户端默认只允许 5 个并发 Socket 连接,当某一个时刻 HTTP 客户端请求创建过多,超过这个数字时,就会发生 socket hang up 错误。解决方法也很简单,通过 http.globalAgent.maxSockets 属性把这个数字改大些即可。另外,https 模块遇到这个问题时也一样通过 https.globalAgent.maxSockets 属性来处理。


在 Node.js 中使用 needle 库发起请求时遇到 socket hang up 报错,通常是由于网络连接问题或服务器响应异常导致的。以下是一些可能的解决方法和代码示例来帮助你排查和解决这个问题。

  1. 增加超时时间: 默认情况下,请求的超时时间可能较短,你可以尝试增加超时时间来避免由于网络延迟导致的错误。

    const needle = require('needle');
    
    needle.get('http://example.com', { timeout: 10000 }, (err, res, body) => {
        if (err) {
            console.error('Error:', err.message);
            return;
        }
        console.log('Response:', body);
    });
    
  2. 错误处理: 确保你的代码中有适当的错误处理逻辑,以便在发生错误时能够记录并处理。

    needle.get('http://example.com', (err, res, body) => {
        if (err) {
            if (err.code === 'ECONNRESET' || err.message.includes('socket hang up')) {
                console.error('Socket hang up error');
            } else {
                console.error('Other error:', err.message);
            }
            return;
        }
        console.log('Response:', body);
    });
    
  3. 检查服务器状态: 确保你请求的服务器是可达的,并且没有发生任何内部错误。

  4. 使用其他库: 如果问题依旧存在,你可以考虑使用其他更稳定的 HTTP 请求库,如 axiosnode-fetch

通过上述方法,你应该能够定位并解决 socket hang up 报错的问题。如果问题依旧存在,建议进一步检查网络环境和服务器日志。

回到顶部