Как исправить ошибку ECONNREFUSED при попытке подключиться к пулу postgresql в nodejs - PullRequest
0 голосов
/ 09 января 2019

Когда я пытаюсь выполнить массовый запрос в nodejs с promise.all, я получил ошибку ECONNREFUSED после того, как некоторое количество запросов привело к успеху.

Я создаю сервер узлов для своего веб-приложения. Я сделал несколько запросов в результате запросов 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 на клиент POSTGRESQL

Я пропустил некоторый запрос в массиве обещаний

но ничего не изменилось. Было вставлено почти 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.

1 Ответ

0 голосов
/ 09 января 2019

Ваш код, кажется, разбит на части, поэтому не может указать точную строку для ошибки, но ошибка возникает из-за одной причины, пула соединений.

Ваш код пытается создать соединение с POSTGRES каждый раз, когда вы запрашиваете базу данных, поэтому для начальных запусков некоторые данные вводятся в базу данных, а затем начинаются сбои, вам необходимо каждый раз удалять соединяющую деталь из раздела запроса и использовать один экземпляр для обработки запроса, а также для закрытия соединения после его завершения.

Вы также упомянули, что обновили Win 7 до Win 10, они не имеют проблем с версией Windows, но ваше оборудование может иметь более высокую конфигурацию (Ram и количество ядер), то, как цикл обработки событий работает некоторое время вы не получите эту ошибку с системами с низкой конфигурацией, но с большими системами конфигурации вы получите эти ошибки.

...