#node.js #database #typescript #postgresql #node-postgres
#node.js #База данных #typescript #postgresql #узел-postgres
Вопрос:
Я использую node-pg
с typescript.
У меня есть утилита getPool из документа https://node-postgres.com/features/pooling
export const getPool = (config?: PoolConfig) => {
const pool = new Pool(config);
pool.on('error', (err, client) => {
console.error('Unexpected error on idle client', err);
process.exit(-1);
});
return pool;
};
Я использую это так в контексте async / await
const pool = getPool();
await pool.query('my sql query here...');
Когда у меня неверный SQL-запрос, я получаю такую ошибку:
error: null value in column "foo" violates not-null constraint
at Parser.parseErrorMessage (node_modules/pg-protocol/src/parser.ts:357:11)
at Parser.handlePacket (node_modules/pg-protocol/src/parser.ts:186:21)
at Parser.parse (node_modules/pg-protocol/src/parser.ts:101:30)
at Socket.<anonymous> (node_modules/pg-protocol/src/index.ts:7:48)
Примечание: я бы понял, если бы pool.on('error')
обратный вызов ‘s украл мою трассировку стека, но ошибки не имеют префикса Unexpected error on idle client
Обратите внимание, что в трассировке стека нет строки, указывающей на файл в моей кодовой базе.
Моя проблема в том, что у меня сотни запросов в моей кодовой базе, и я хотел бы иметь возможность отслеживать строку, которая вызвала сбой pool.query()
. Это очень помогло бы определить, какой запрос вызвал ошибку.
Ожидаемый :
error: null value in column "foo" violates not-null constraint
at ...
at mycodebase/src/myfile.ts:42
Комментарии:
1. У меня такая же проблема, и я хотел бы знать ответ
2. В итоге я использовал Prisma для подключения к своей базе данных.
3. Я думаю, вы могли бы использовать прикрепить обработчик ошибок к пулу, например
pool.on('error', (e)=>{logger.error(e); throw e;})
, это будет регистрировать точную ошибку, а для asyc / await try / catch будет перехватывать любую выданную ошибку.
Ответ №1:
Я использую грязный взлом (патч Pool.prototype
), но он работает для меня:
const originalPoolQuery = Pool.prototype.query;
Pool.prototype.query = async function query(...args) {
try {
return await originalPoolQuery.apply(this, args);
} catch (e) {
// All magic is here. new Error will generate new stack, but message will copyid from e
throw new Error(e)
}
}
// After hack create pool and good luck
const pool = new Pool({})
await pool.query('SELECT * FROM ...')
Трассировка стека в этом случае будет более информативной.
Я думаю, что pool.on('error', cb)
это не для обнаружения ошибок запроса, а для ошибок подключения (я не уверен)
Комментарии:
1. Это отличный шаг вперед, я вижу трассировки стека и файл, из которого он получен, но по какой-то причине номера строк трассировки стека неверны или смещены
2. Может быть, это причина TypeScript? Я не видел несоответствия номера строки