pg client.on ('error' не обнаруживает нарушение работы сети - PullRequest
0 голосов
/ 15 ноября 2018

Мое приложение подключается к базе данных и прослушивает события, чтобы оно могло выполнять события. Если соединение с базой данных обрывается, то оно должно быть в состоянии обнаружить его с помощью consumer.db.on('error'

Соответствующая документация:

client.on ('error', (err: Error) => void) => void

Когда клиент находится в процессе подключения, отправки или отключения запроса, он будет перехватывать и пересылать сообщения об ошибках с сервера PostgreSQL на соответствующий файл client.connect client.query или client.end callback / обещание; тем не менее, клиент поддерживает долгоживущее соединение с серверной частью PostgreSQL, и из-за сетевых разделов, серверных сбоев, аварийного переключения и т. д. клиент может (и в течение достаточно длительного периода времени) в конечном итоге отключиться, пока он простаивает Чтобы справиться с этим, вы можете прикрепить прослушиватель ошибок к клиенту, чтобы перехватывать ошибки. Вот надуманный пример:

const client = new pg.Client()
client.connect()

client.on('error', (err) => {
  console.error('something bad has happened!', err.stack)
})

// walk over to server, unplug network cable

// process output: 'something bad has happened!' followed by stacktrace :P

Вот мой код, пытающийся сделать то же самое:

var pg = require('pg');

// get the connection from the connection pool
pg.connect('pg://some:user@some.server', function(err, db){

  // throw error
  if(err) {
    // handle the error - reconnect and log
  }

  // set database connection for global use
  consumer.db = db;

  // when notification received
  consumer.db.on('notification', function(event){
    console.log(event);
    // do something with the event
  });

  // Detect network disruption and other errors
  consumer.db.on('error', function(event){
    console.log("Error!")
    // handle the error - reconnect and log
  });
});

Я проверил эту функцию, отключив Wi-Fi на 5 минут. Конечно, соединение разорвано, но событие ошибки не было создано, и на консоль ничего не вошло. Я также попытался закрыть удаленную базу данных с теми же результатами.

Как я могу получить сообщение об ошибке при разрыве соединения?

1 Ответ

0 голосов
/ 16 ноября 2018

Проблема была в старой версии pg

Пул по умолчанию и pg.connect(...) были удалены в v7.0.0: https://github.com/brianc/node-postgres/blob/master/CHANGELOG.md#700

Также выглядиткак client.on('error', ...) в то время не поддерживало сбои в работе сети.

Обновление до ^ 7.0.0

Моя версия pg была 4.5.7.

После обновления до последней версии pg (7.6.1) и замены

pg.connect('pg://some:user@some.server', function(err, db){

на

const connectionConfig = {
    host: config.database.server,
    port: config.database.port,
    database: config.database.database,
    user: config.database.username,
    password: config.database.password
  }
  // get the connection from the connection pool
  consumer.pool = new pg.Pool(connectionConfig)
  consumer.pool.on('error', function(error) {
    consumer.handleError();
    return;
  });
  consumer.pool.connect(function(err, db){

Проблема была исправлена.

...