Получить информативную трассировку стека в node-pg

#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? Я не видел несоответствия номера строки