【问题标题】:"Socket hang up" error during request请求期间出现“套接字挂起”错误
【发布时间】:2018-03-13 00:00:02
【问题描述】:

我尝试通过 node.js 版本 0.8.14 的 http 模块向某个站点(不是我自己的站点)发出 GET 请求。这是我的代码(CoffeeScript):

options = 
        host: 'www.ya.ru'
        method: 'GET'
    req = http.request options, (res) ->
        output = ''
        console.log 'STATUS: ' + res.statusCode
        res.on 'data', (chunk) ->
            console.log 'A new chunk: ', chunk
            output += chunk

        res.on 'end', () ->
            console.log output
            console.log 'End GET Request'

    req.on 'error', (err) ->
        console.log 'Error: ', err
    req.end()

我在此操作期间收到以下错误:{ [错误:套接字挂起]代码:'ECONNRESET'}。如果我评论错误处理程序,我的应用程序将完成以下错误:

events.js:48
    throw arguments[1]; // Unhandled 'error' event
    ^
Error: socket hang up
    at createHangUpError (http.js:1091:15)
    at Socket.onend (http.js:1154:27)
    at TCP.onread (net.js:363:26)

我试图在互联网上找到解决方案,但仍然没有找到。如何解决这个问题?

【问题讨论】:

  • 我还发现,有时如果我过于激进地抓取网站(例如同时连接 10 个以上),他们会开始响应套接字挂断,所以也可能是这样。

标签: node.js


【解决方案1】:

您必须结束请求。在脚本末尾添加:

req.end()

【讨论】:

  • 我已经添加了这一行(请看更新的问题),但仍然得到错误。
  • @Dmitriy 您是否在其他地方使用相同的代码,您的代码是否还有更多内容。你必须结束每一个请求。请务必单独运行发布的代码。
【解决方案2】:

使用http.request() 时,您必须在某个时候调用request.end()

req = http.request options, (res) ->
    # ...

req.on 'error', # ...

req.end() # <---

在此之前,request 保持打开状态以允许writing a body。而且,错误是因为服务器最终会认为连接已超时并将其关闭。

或者,您也可以将http.get()GET 请求一起使用,这将自动调用.end(),因为GET 请求aren't normally expected to have a body

【讨论】:

  • 我已经添加了这一行(请查看更新后的问题),但仍然出现错误。我也尝试使用 http.get() 方法。我从 node.js 文档中举了一个例子,但仍然得到“socket hang up”错误。
  • @Dmitriy 嗯。在顶部添加http = require 'http',我可以看到您当前sn-p 的响应。您可以检查 DNS 以确保计算机可以访问服务器 -- require('dns').lookup('www.ya.ru', console.log);
  • dns.lookup 对我来说正常工作。我得到以下回调参数:错误:null,地址:'77.88.21.3',家庭:4。可能有些问题是我使用代理服务器进行互联网连接?
【解决方案3】:

在我的情况下,它是 'Content-Length' 标头 - 我把它拿出来了,现在很好......

代码:

function sendRequest(data)
{
    var options = {
              hostname: host,
              path: reqPath,
              port: port,
              method: method,
              headers: {
                      'Content-Length': '100'
              }
    var req = http.request(options, callback);
    req.end();
    };

去掉这行后:'Content-Length': '100'就搞定了。

【讨论】:

    【解决方案4】:

    我终于发现了问题并找到了解决方案。问题是我使用代理服务器连接到互联网。这是工作代码:

    options = 
        hostname: 'myproxy.ru'
        path: 'http://www.ya.ru'
        port: 3128
        headers: {
            Host: "www.ya.ru"
        }
    req = http.request options, (res) ->
        output = ''
        console.log 'STATUS: ' + res.statusCode
        res.on 'data', (chunk) ->
            console.log 'A new chunk: ', chunk
            output += chunk
    
        res.on 'end', () ->
            console.log output
            console.log 'End GET Request'
    
    req.on 'error', (err) ->
        console.log 'Error: ', err
    req.end()
    

    感谢大家的帮助和建议!

    【讨论】:

      【解决方案5】:

      我发现这种情况发生在另一种情况下,我在从intern 框架调用的删除操作中发送空正文,例如 - '{}' 进行测试; 相反,我在通过

      发出请求时使用 null 作为 body 参数的值发送

      【讨论】:

        【解决方案6】:

        nodejs从0.10.33升级到0.12时,遇到这个错误。

        就我而言,删除请求有一个正文 (json)。早些时候,节点客户端设置 - 'transfer-encoding' 为分块 - 默认情况下,当 'content-length' 未设置时。似乎在最近的版本中 - 节点客户端默认停止设置传输编码。

        修复是在请求中设置它。

        【讨论】:

          【解决方案7】:

          在我的情况下,升级到node 8.0.0 后,帖子不再工作了。将Content-Length 添加到标题没有帮助。必须将 'Connection': 'keep-alive' 添加到 header 以消除此错误。

              let postOptions = {
                  method: 'POST',
                  form: form,
                  url: finalUrl,
                  followRedirect: false,
                  headers:{
                      'Connection': 'keep-alive'
                  }
              };
              request(postOptions, handleSAMLResponse);
          

          【讨论】:

            猜你喜欢
            • 2014-03-21
            • 1970-01-01
            • 1970-01-01
            • 2019-07-17
            • 1970-01-01
            • 1970-01-01
            • 2023-03-26
            • 2019-03-10
            • 2015-09-13
            相关资源
            最近更新 更多