尝试在Node.js中连接到Postgresql池时如何修复ECONNREFUSED错误

时间:2019-01-09 11:11:39

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

当我尝试使用promise在nodejs中进行批量查询时,在经过一定数量的查询后,我得到了ECONNREFUSED错误。

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

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

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

我在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,现在是Windows10。

1 个答案:

答案 0 :(得分:0)

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

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

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