首页 > 解决方案 > 从玩笑中获取正确的堆栈跟踪

问题描述

我目前正在调试一些用 jest over typescript 编写的测试,我有点头疼。

如果测试或测试类运行 Postgres SQL 并且查询中有错误,我会得到错误的堆栈跟踪,例如:

error: invalid input syntax for type integer: ""0""
    at Parser.parseErrorMessage (/Users/sklivvz/src/xxx/node_modules/pg-protocol/src/parser.ts:369:69)
    at Parser.handlePacket (/Users/sklivvz/src/xxx/node_modules/pg-protocol/src/parser.ts:188:21)
    at Parser.parse (/Users/sklivvz/src/xxx/node_modules/pg-protocol/src/parser.ts:103:30)
    at Socket.<anonymous> (/Users/sklivvz/src/xxx/node_modules/pg-protocol/src/index.ts:7:48)
    at Socket.emit (node:events:365:28)
    at addChunk (node:internal/streams/readable:314:12)
    at readableAddChunk (node:internal/streams/readable:289:9)
    at Socket.Readable.push (node:internal/streams/readable:228:10)
    at TCP.onStreamRead (node:internal/stream_base_commons:190:23)

“错误”行非常有用,但是,堆栈跟踪只告诉我错误是由 pg-protocol 驱动程序引发的。我想知道我的代码中的哪一行产生了错误。

我有 82.7% 的把握确定这是因为 PGquery是异步的。

console.log当只需要显示正确的调用堆栈以使其变得更好时,不得不逐步调试或(喘气)我的方式来处理每个错误是非常耗时的。

有没有人找到让这个开发人员友好的方法?

标签: javascripttypescriptpostgresqljestjsstack-trace

解决方案


检查这是否与brianc/node-postgres问题 2484有关

当您从解析器返回语法错误时,是否(有)首选的包、扩展或方法来提供更多详细信息?
(例如,列出行号、错误列的一个)

例如,现在:

error: syntax error at or near "as"
   at Parser.parseErrorMessage (/home/collspec/projects/staff-portal/sprint-server/node_modules/pg-protocol/dist/parser.js:278:15)

期望的行为:

error: syntax error at or near "as", line 5, column 7
   at Parser.parseErrorMessage (/home/collspec/projects/staff-portal/sprint-server/node_modules/pg-protocol/dist/parser.js:278:15)

该问题的可能解决方法

驱动程序填充的错误对象上有一堆附加字段。
如果您记录错误对象,您可以看到它们。它们对应于服务器返回的错误字段

例如使用命令:

SELECT foo
FROM bar

你会得到这样的错误:

{
 length: 102,
 severity: 'ERROR',
 code: '42P01',
 detail: undefined,
 hint: undefined,
 position: '17',
 internalPosition: undefined,
 internalQuery: undefined,
 where: undefined,
 schema: undefined,
 table: undefined,
 column: undefined,
 dataType: undefined,
 constraint: undefined,
 file: 'parse_relation.c',
 line: '1180',
 routine: 'parserOpenTable'
}

你想要的是位置。它为您提供错误 SQL 中的字符偏移量。
在本例中,位置值“17”指的是 SQL 中柱形标记的开始。
它并不总是被填充,因为它取决于导致错误的原因(通常只是解析错误)。


推荐阅读