【问题标题】:Node.js sporadic 'ECONNREFUSED' error on request.get在 request.get 上出现 Node.js 零星的“ECONNREFUSED”错误
【发布时间】:2016-05-10 12:55:21
【问题描述】:

我的节点/环回服务器偶尔出现问题。我的设置如下:

编辑:我的节点版本是 v4.2.4,我在 Windows 10 专业版上运行节点。

客户端:

  • nw.js 客户端,它遍历本地文件系统并计算文件的 MD5 值。

  • 使用request.post,客户端以'fileHash: d41d8cd98f00b204e9800998ecf8427e' 格式将文件的哈希发送到服务器(这只是一个示例哈希,我知道它是一个空文件)

    function checkHash (fileHash){
    request.post({
        headers: {'content-type' : 'application/x-www-form-urlencoded'},
        url: 'http://localhost:3000/api/checkBoths/hashcheck',
        method: 'POST',
        form: {
           fileHash: fileHash
        }
    }, function(error, response, body){
       if(error) {
        console.log(error);
       } else {
        console.log(response.statusCode, body);
       }
    });
    
    }
    

服务器端:

  • localhost:3000 运行的节点/环回服务器。

  • hashCheck 函数用于读取从客户端发布的数据并查询 MySQL 数据库以匹配哈希。

  • 如果哈希值存在于数据库中,来自服务器的响应格式为goodResult : true,否则为goodResult : false

    var request = require('request');
    
    module.exports = function (CheckBoth) {
    
    var goodResult;
    
    CheckBoth.hashCheck = function (fileHash, cb) {
    
    requestGood(fileHash);
    
      function requestGood (fileHash) {
    
    request.get('http://127.0.0.1:3000/api/Goodhashes/' + fileHash + '/exists', function (error, response, body) {
      if (!error && response.statusCode == 200) {
        goodResult = JSON.parse(body).exists;
      }
      if (error) {
        console.error(error);
      }
    });
    console.log(goodResult);
      }
    
    cb( goodResult);
    };
    
    
    CheckBoth.remoteMethod(
    'hashCheck',
    {
      accepts: {arg: 'fileHash', type: 'string'},
      returns: [{arg: 'goodResult', type: 'string'}]
    }
    );
    };
    

问题:

在响应中出现以下内容之前,服务器可以响应大约 1000 个查询:

{ [Error: connect ECONNREFUSED 127.0.0.1:3000]
  code: 'ECONNREFUSED',
  errno: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 3000 }

我尝试在服务器代码中放入不同的回调,但这并没有什么不同。我想我可能应该限制对服务器的请求,但我不知道如何实现这一点。

任何帮助将不胜感激。

【问题讨论】:

  • 你运行的是哪个版本的节点?
  • @migg 我正在运行 v4.2.4
  • 嗯...您的参数称为callback,但您调用的是cb。也许您正在使用它创建一个 memleak,直到服务器拒绝连接?
  • @migg 哎呀...这实际上是我如何复制文件的错误。在我的实际代码中,它们都被称为 cb。我将编辑我的问题以反映这一点。感谢您指出这一点。
  • 现在 badResultmhrResult 仍未定义。当您将 CheckBoth 注入到模块中时,但您在内部进行了更改,您可能仍然在泄漏内存。你应该调试你的应用消耗了多少内存。

标签: javascript mysql node.js loopbackjs nw.js


【解决方案1】:

大多数系统的 ulimit 默认值为 1024。请参阅 limits.conf (http://linux.die.net/man/5/limits.conf) 的手册。

虽然@migg 关于确保您的应用程序中没有内存泄漏是正确的,但它的进程处理为高负载调整系统也是相当多应用程序的正常过程。

试试这个,看看是否有帮助;

$ ulimit -n 65535

编辑:我没有对此进行测试,但这里有一份来自 ibm 的关于 Windows 的文档; http://www-01.ibm.com/support/docview.wss?uid=swg21392080

【讨论】:

  • 我应该提到我正在 Windows 10 机器上进行开发。我不确定你是否可以在 Windows 中设置 ulimit。
  • 感谢您的建议。似乎 Microsoft 的基于 UNIX 的应用程序子系统 (SUA) 或 Windows UNIX 服务 (SFU) 在 Windows 8.1 Enterprise 中均已弃用,因此我无法修改这些注册表值,因为它们在 Windows 10 上不存在。
  • 我已经十多年没有定期使用 Windows,但即使在 Windows 2002 Server 上,如果它们不存在,您也可以添加注册表项,它们会影响功能。
  • 我已经添加了注册表项并重新启动了机器,但我仍然遇到同样的问题。我还允许防火墙中端口 3000 上的所有流量,看看是否有帮助,但没有区别。感谢您的建议!
  • @Oddball 我为 StrongLoop 工作,在 LoopBack 中没有任何形式的速率限制。您链接到的是我们的 API 网关,它允许开发人员限制对其服务器的访问。由于您没有使用我们的网关,因此不会发生这种情况。
猜你喜欢
  • 2013-12-21
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2021-02-27
相关资源
最近更新 更多