【问题标题】:How to fix an ECONNREFUSED error when try to connect to a postgresql pool in nodejs尝试连接到 nodejs 中的 postgresql 池时如何修复 ECONNREFUSED 错误
【发布时间】:2019-01-09 11:11:38
【问题描述】:

当我在 nodejs 中尝试使用 promise.all 进行批量查询时,在一些查询成功后出现 ECONNREFUSED 错误。

我正在为我的 Web 应用程序构建节点服务器。我做了一些来自客户端的 AJAX 请求的查询。到目前为止,他们都工作得很好。

我尝试将数据从 excel 加载到一些表中(我使用 pg 模块)。我写了一个代码,如果没有相同的记录,则在读取后插入记录。我使用 promise 进行查询。但它进行了一些查询,然后开始出现 ECONNREFUSED 错误。

  • 我已将 max_connections 更改为 10000,将 shared_buffers 更改为 25000MB。并重启 postgres 服务器
  • 我已将 max_connections 更改为 1000,将 shared_buffers 更改为 2500MB。然后重新启动 postgres 服务器
  • 我已将 max_connections 更改为 300,将 shared_buffers 更改为 2500MB。并重启 postgres 服务器
  • 我已将代码从 POSTGRESQL 池更改为 POSTGRESQL 客户端

我在 promise 数组中省略了一些查询

但没有任何改变。总共插入了近 180 条记录。然后就报错了。


    function loadData(auditArrayObject){
        return new Promise(function (resolve, reject) {
            let promises=[
                loadAuditItem(auditArrayObject.audit,
                             auditArrayObject.auditVersion),
                loadProcesses(auditArrayObject.processArray),
                loadControlAims(auditArrayObject.controlAimArray),
                loadCriterias(auditArrayObject.criteriaArray),
                loadParameters(auditArrayObject.parameterArray),
            ]
            Promise.all(promises)
            .then(objectsWithId=>{
              ......
            }
    }

    function loadProcesses(processArray){
        return new Promise(function (resolve, reject) {
            let promises=[];
            for(let i=0;i<processArray.length;i++){
                let process= new Process(null,processArray[i],false)
                let promise= postGreAPI.readProcessByName(process.name)
                             .then(resultProcess=>{
                                if (!resultProcess) {
                                    postGreAPI.createProcess(process)
                                    .then(createdProcess=>{
                                        resolve(createdProcess)
                                    })
                                    .catch(err=>{
                                        reject({msg:"createProcess 
                                               hata aldı",err:err})
                                    })
                                } else {
                                    return (resultProcess)
                                }
                             })
                             .catch(err=>{
                                reject({msg:"readProcessByName 
                                        hata aldı",err:err})
                             })
                promises.push(promise)
            }
            Promise.all(promises)
            .then(processArray=>{
                resolve({key:"Process",value:processArray})
            })
            .catch(err=>{
                reject({msg:"Processlerden birisi insert edilemedi",err:err})
            })
        });
    }

    postGreAPI.readProcessByName:

    var readProcessByName = function (name){

            return new Promise(function (resolve, reject) {
                let convertedName=convertApostrophe(name)
                let query = "SELECT * FROM process WHERE name='" 
                          + convertedName + "'"
                queryDb(query)
                .then(result=>{
                    if (result.rows.length>0){
                        let process = new Process(result.rows[0].id,
                                                  result.rows[0].name,
                                           result.rows[0].isactive);
                        resolve(process)
                    }else{
                        resolve(null)
                    }
                })
                .catch(err=>{
                    reject(err)
                })
            })

        }

    queryDb:

    var queryDb2 = function (query,params) {
            return new Promise(function (resolve, reject) {
                let pool = new PostGre.Pool(clientConfig);
                pool.connect(function(err, client, done) {
                    if(err) {
                        return reject (err);
                    }
                    client.query(query,params, function(err, result) {
                        done();
                        if(err) {
                            return reject (err);
                        }
                        resolve(result)
                    });
                });
            })
        }

错误是:

     Error: connect ECONNREFUSED 127.0.0.1:5432
        at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1113:14)
      errno: 'ECONNREFUSED',
      code: 'ECONNREFUSED',
      syscall: 'connect',
      address: '127.0.0.1',
      port: 5432 }

实际上,在我的笔记本电脑配置更改之前,我已经成功加载。之前有 Windows 7,但现在有 Windows 10。

【问题讨论】:

  • 您是否可能为每一行创建一个新连接,然后立即再次关闭它?在这种情况下,这可能是一个 Windows 问题:Windows 将关闭的端口保持打开(保留?)一段时间。因此,如果您不断(并且快速)打开和关闭连接,这可能意味着 Windows 会耗尽(客户端)端口。您能否将代码重构为仅在整个过程中打开并使用 single 连接? (顺便说一句:它是 Postgres 或 PostgreSQL,但 not "postGre"
  • 回答问题。似乎是固定的。当我为整个过程创建一次池时。

标签: node.js postgresql pool econnrefused pg-node


【解决方案1】:

您的代码似乎是零碎的,因此无法为错误指出确切的行,但是由于连接池的一个原因而出现错误。

每次查询数据库时,您的代码都会尝试创建与 POSTGRES 的连接,因此对于初始运行,一些数据会输入到数据库中,然后开始失败,您需要从查询部分中删除每次连接部分并使用单个实例来处理查询并在完成后关闭连接。

您还提到您已经从 Win 7 升级到 Win 10,Windows 版本没有问题,但您的硬件可能也有更高的配置(Ram 和内核数),事件循环的工作方式您有一段时间不要'低配置系统不会出现此错误,但配置较大的系统会出现这些错误。

【讨论】:

    猜你喜欢
    • 2022-08-18
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2016-01-22
    • 2018-08-11
    • 2022-11-03
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多