У меня возникла проблема с обнаружением ошибки, выдаваемой пакетом 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/Await
Try/Catch
, показанный выше - Я пробовал pgPool.query().then().catch()
- Комбинации двух. Я даже пытался запустить catch против самого экземпляра пула. Что бы я ни делал, я не могу обработать исключение, не используя process.on('unhandledRejection', ...)
Node, что, конечно, плохая идея.
Я ломал голову над этим часами. Есть ли способ, которым я могу поймать и обработать такие ошибки, чтобы мой сервер не зависал каждый раз? Заранее спасибо!
Я ценю быстрый ответ, но это не работает. Пакет pg не направляет эту конкретную ошибку через свой обработчик ошибок. Просто бросают.
Если передача undefined
вызывает исключение, которое приведенный выше код не обрабатывает, это ошибка. Убедитесь, что у вас установлена последняя версия pg
, а затем сообщите о проблеме на github.
Я смог воспроизвести это, и, похоже, это настоящая ошибка в 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 и дождаться исправления ошибки или разветвить репо и использовать описанный выше обходной путь, я боюсь.
Я ценю ответ. К сожалению, это проблема с пакетом. Я предполагаю, что мое замешательство произошло из-за того, что я не знал, что сброшенные ошибки не будут всплывать через стек вызовов. Кажется довольно неэффективным.