请求期间“套接字挂断”错误

我尝试通过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() 

在这个操作过程中出现以下错误:{[Error:socket hang up] code:'ECONNRESET'}。 如果我评论error handling程序我的应用程序完成以下错误:

 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) 

我试图find在互联网上的解决scheme,但还没有find他们。 如何解决这个问题?

你必须结束这个请求。 在脚本的最后加上这个:

 req.end() 

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

 req = http.request options, (res) -> # ... req.on 'error', # ... req.end() # <--- 

在此之前, request被打开以允许写入一个主体 。 而且,错误是因为服务器最终会认为连接超时并closures它。

或者,您也可以使用http.get()GET请求,它们会自动调用.end()因为GET请求通常不会有正文 。

在我的情况下,这是“内容长度”标题 – 我拿出来,现在没事了…

码:

 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(); }; 

删除行后: '内容长度':'100'它整理出来。

我终于发现了这个问题,并find了解决办法。 问题是我使用代理服务器连接到互联网。 这是工作代码:

 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() 

谢谢大家的帮助和build议!

我发现这发生在一个更多的情况下,我发送一个空的身体 – “{}”在从实习生框架中调用的删除操作进行testing; 相反,我使用null发送作为身体参数的价值,同时使请求通过

在我的情况下,升级到node 8.0.0 ,该post不再工作。 添加Content-Length到标题没有帮助。 必须添加'Connection': 'keep-alive'头,而不是为了得到这个错误。

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

当从nodejs的0.10.33升级到0.12时,这个错误被打了。

在我的情况下,删除请求有一个主体(json)。 之前,节点客户端在设置'content-length'时,默认情况下将'transfer-encoding'设置为chunked。 看来在最近的版本 – 节点客户端默认停止设置传输编码。

修正是在请求中设置它。