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
