我尝试通过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)
我试图在互联网上找到解决方案,但仍未找到它们。如何解决这个问题?
答案 0 :(得分:32)
您必须结束请求。在脚本的末尾添加:
req.end()
答案 1 :(得分:15)
使用http.request()
时,您必须在某个时候致电request.end()
。
req = http.request options, (res) ->
# ...
req.on 'error', # ...
req.end() # <---
在此之前,request
处于打开状态以允许writing a body。并且,错误是因为服务器最终会认为连接超时并将其关闭。
或者,您也可以将http.get()
与GET
次请求结合使用,这些请求会在.end()
请求aren't normally expected to have a body后自动调用GET
。
答案 2 :(得分:8)
在我的情况下,它是'内容长度'标题 - 我把它拿出来现在很好......
代码:
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'整理出来。
答案 3 :(得分:5)
我终于发现了问题并找到了解决方案。问题是我使用代理服务器连接到互联网。这是工作代码:
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()
谢谢大家的帮助和建议!
答案 4 :(得分:1)
我发现这种情况发生在另一个案例中,我发送空身像 - &#39; {}&#39;在从intern框架调用的删除操作中进行测试; 相反,我在通过
发出请求时使用null作为body参数的值发送答案 5 :(得分:0)
当从0.10.33升级到0.12的nodejs时,会遇到此错误。
就我而言,删除请求有一个正文(json)。之前,节点客户端正在设置 - 'transfer-encoding'为chunked - 默认情况下未设置'content-length'。似乎在最近的版本中 - 节点客户端默认停止设置传输编码。
修复是在请求中设置它。
答案 6 :(得分:0)
就我而言,升级到node 8.0.0
后,帖子不再有用了。向标头添加Content-Length
无济于事。必须将'Connection': 'keep-alive'
添加到标题,而不是将此错误消除。
let postOptions = {
method: 'POST',
form: form,
url: finalUrl,
followRedirect: false,
headers:{
'Connection': 'keep-alive'
}
};
request(postOptions, handleSAMLResponse);