【问题标题】:Socket hang up error with multiple http.get requests带有多个 http.get 请求的套接字挂起错误
【发布时间】:2014-02-22 16:48:44
【问题描述】:

我正在使用 node.js 通过 http.get 请求和 async.eachLimit 方法下载大量文件。

当我将async方法的并发增加到5以上时,容易出现这个'socket hang up'的错误,我不明白为什么。

谁能解释为什么会发生这种情况?

这是收到的错误

events.js:72
        throw er; // Unhandled 'error' event
          ^
Error: socket hang up
    at createHangUpError (http.js:1472:15)
    at Socket.socketOnEnd [as onend] (http.js:1568:23)
    at Socket.g (events.js:180:16)
    at Socket.EventEmitter.emit (events.js:117:20)
    at _stream_readable.js:920:16
    at process._tickCallback (node.js:415:13)

这是使用 async.eachLimit 方法重复调用的函数

        var urlPre = "http://api.steampowered.com/IEconItems_440/GetPlayerItems/v0001/?key=";
        var urlSidPre = "&steamid=";
        var urlInvSuf = "&inventory=yes";
        var URL = urlPre+steam_API+urlSidPre+sid+urlInvSuf;
        //log.info("Downloading "+ alias + "'s inventory");
        http.get(URL, function (res) {
            var body = '';
            res.on('data', function (data) {
                body+=data; 
                fs.appendFile(invLoc, data);
            });
            res.on('end', function() {
                try {
                    inventory = JSON.parse(body);
                    //log.info(alias + "'s inventory downloaded");
                } catch (e) {
                    fs.unlinkSync(invLoc);
                    log.error("parsing " + alias+"'s inventory");
                    loadInventory(sid, alias, invFolder, callback); 
                    return;
                }
                callback(inventory, alias);
            });
            res.on('error', function (e, socket) {
                log.error(alias + " inventory error")
            })
        })

【问题讨论】:

    标签: javascript node.js sockets


    【解决方案1】:

    我认为你的问题和这些人一样:

    https://github.com/ether/etherpad-lite/issues/1541

    尝试将监听器添加到套接字的error event

    http.get(...)
    .on('error', function(e) {
      console.log("Got error: " + e.message);
    });
    

    【讨论】:

    • 我已经没有的“错误”监听器没有做同样的事情吗?
    • 没有。您为 ServerResponse 定义了一个错误侦听器。但错误来自 ClientRequest (http.get)。
    • 谢谢,我遇到了几千个错误中的一个。
    • 度过了我的一天(实际上是晚上),谢谢@PedroNasser。我已经花了超过 2 天。
    猜你喜欢
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2019-03-06
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多