node.js - Få informativ stackspårning i node-pg


Jag använder node-pg med TypeScript.

Jag har ett getPool-verktyg från dokumentationen 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;
};

Jag använder det så här i ett async/await-sammanhang

const pool = getPool();
await pool.query('my sql query here...');

När jag har en ogiltig SQL-fråga får jag den här typen av fel:

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)

Obs: Jag skulle förstå om det var pool.on('error'):s callback som stal min stackspårning, men felen är inte försedda med prefixet Unexpected error on idle client

Notera i stackspåret att det inte finns någon rad som pekar på en fil i min kodbas.

Mitt problem är att jag har hundratals frågor i min kodbas, och jag skulle vilja kunna spåra raden som kallade den misslyckade pool.query(). Detta skulle hjälpa mycket att hitta vilken fråga som utlöste felet.

Förväntad :

error: null value in column "foo" violates not-null constraint

  at ...
  at mycodebase/src/myfile.ts:42

Svar #1

Jag använder en smutsig hack (patch Pool.prototype), men det fungerar för mig:

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 ...')

Stackspår i detta fall kommer att vara mer informativt.

Jag tror att pool.on('error', cb) inte är för att fånga query-fel, utan för anslutningsfel (jag är inte säker)

Svar #2

En ny uppdatering av node-postgres ger korrekt stacktrace.

https://github.com/brianc/node-postgres/pull/2983

Relaterade artiklar