23

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

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

4

7 回答 7

36

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

req.end()
于 2013-09-18T08:45:28.343 回答
18

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

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

req.on 'error', # ...

req.end() # <---

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

或者,您也可以使用http.get()with GETrequests ,它会.end()自动调用,因为GETrequests通常不会有 body

于 2013-09-18T08:44:17.670 回答
10

在我的情况下,它是“内容长度”标题 - 我把它拿出来了,现在很好......

代码:

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'它整理出来。

于 2014-02-05T19:55:19.527 回答
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()

谢谢大家的帮助和建议!

于 2013-09-18T12:47:43.817 回答
1

我发现这发生在另一种情况下,我在从实习框架调用的删除操作中发送空正文,例如 - '{}'进行测试;相反,我在发出请求时使用 null 作为 body 参数的值发送

于 2015-01-25T18:40:12.267 回答
0

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

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

修复是在请求中设置它。

于 2015-03-22T07:53:46.460 回答
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);
于 2017-06-27T19:56:39.820 回答