Почему я не могу поймать ошибку, выдаваемую node-postgres?

У меня возникла проблема с обнаружением ошибки, выдаваемой пакетом Node-Postgres NPM.

На первый взгляд проблема кажется простой, но я перепробовал все, что мог придумать.

Мой код выглядит следующим образом:

import { Pool } from 'pg' // Import postgres connection pool
const pgPool = new Pool()

async function queryDatabase() {
  try {

    // Force TypeError by passing undefined
    let queryResult = await pgPool.query( undefined )

    if ( queryResult.rows.length > 0 ) {
      return queryResult.rows[0]
    }

    return false

  } catch( err ) {

    // Never Reached
    return new Error( 'Test error' )

  }
}
queryDatabase()

А ошибка следующая:

TypeError: Клиенту был передан нулевой или неопределенный запрос
в Client.query (~/.../node_modules/pg/lib/client.js:479:11)

Сама ошибка довольно понятна. Я форсирую ошибку здесь, чтобы попытаться обработать ее в случае, если undefined будет передано по ошибке. Я понимаю, что могу просто выполнить проверку, чтобы убедиться, что ввод никогда не будет нулевым или неопределенным, но это не моя главная задача.

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

Я пробовал множество разных подходов - Метод Async/AwaitTry/Catch, показанный выше - Я пробовал pgPool.query().then().catch() - Комбинации двух. Я даже пытался запустить catch против самого экземпляра пула. Что бы я ни делал, я не могу обработать исключение, не используя process.on('unhandledRejection', ...) Node, что, конечно, плохая идея.

Я ломал голову над этим часами. Есть ли способ, которым я могу поймать и обработать такие ошибки, чтобы мой сервер не зависал каждый раз? Заранее спасибо!

stackoverflow.com/questions/58831423/…
Teemu 09.12.2020 19:21

Я ценю быстрый ответ, но это не работает. Пакет pg не направляет эту конкретную ошибку через свой обработчик ошибок. Просто бросают.

AustinPhillipTaylor 09.12.2020 19:24

Если передача undefined вызывает исключение, которое приведенный выше код не обрабатывает, это ошибка. Убедитесь, что у вас установлена ​​последняя версия pg, а затем сообщите о проблеме на github.

Bergi 09.12.2020 19:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
3
1 965
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я смог воспроизвести это, и, похоже, это настоящая ошибка в pg-библиотеке.

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

Эта ошибка выдается синхронно (т. е. ошибка не передается аргументу callback, например, callback(new TypeError("...")), и, поскольку вокруг вызова try/catch в обратном вызове соединения пула нет client.query, ошибка не будет обнаружена вашим try/catch.

Потенциальным решением может быть обернуть вызов client.query в try catch:

 client.once('error', onError)
      this.log('dispatching query')
      try {
        client.query(text, values, (err, res) => {
          this.log('query dispatched')
          client.removeListener('error', onError)
          if (clientReleased) {
            return
          }
          clientReleased = true
          client.release(err)
          if (err) {
            return cb(err)
          } else {
            return cb(undefined, res)
          }
        })
      }catch(err) {
        return cb(err)
      }

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

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

AustinPhillipTaylor 11.12.2020 21:06

Другие вопросы по теме