请求期间“套接字挂断”错误
我尝试通过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。 看来在最近的版本 – 节点客户端默认停止设置传输编码。
修正是在请求中设置它。