问题描述
我目前正在调试一些在打字稿上用玩笑编写的测试,我有点头疼。
如果测试或测试类运行 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% 的把握确定这是因为 PG 的 query
是异步的。
当只需要显示正确的调用堆栈以使其更好时,必须逐步调试或 (gasp) console.log
我的方式来解决每个错误是非常耗时的。
有没有人找到让这个开发者友好的方法?
解决方法
检查这是否与brianc/node-postgres
issue 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)
Possible workaround 来自那个问题:
驱动程序填充的 Error 对象上有一堆附加字段。
如果您记录错误对象,您可以看到它们。它们对应于 error fields returned by the server:
例如使用命令:
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 中 bar 标记的开始。
它并不总是填充,因为它取决于导致错误的原因(通常只是解析错误)。
我在 DynamoDb 的 aws-sdk 中遇到了类似的问题。这是我通常从 aws-sdk 获得的堆栈跟踪。
ResourceNotFoundException: Requested resource not found
at Request.extractError (D:\workspaces\typescript-starters\console-app\node_modules\aws-sdk\lib\protocol\json.js:52:27)
at Request.callListeners (D:\workspaces\typescript-starters\console-app\node_modules\aws-sdk\lib\sequential_executor.js:106:20)
at Request.emit (D:\workspaces\typescript-starters\console-app\node_modules\aws-sdk\lib\sequential_executor.js:78:10)
at Request.emit (D:\workspaces\typescript-starters\console-app\node_modules\aws-sdk\lib\request.js:688:14)
at Request.transition (D:\workspaces\typescript-starters\console-app\node_modules\aws-sdk\lib\request.js:22:10)
at AcceptorStateMachine.runTo (D:\workspaces\typescript-starters\console-app\node_modules\aws-sdk\lib\state_machine.js:14:12)
at D:\workspaces\typescript-starters\console-app\node_modules\aws-sdk\lib\state_machine.js:26:10
at Request.<anonymous> (D:\workspaces\typescript-starters\console-app\node_modules\aws-sdk\lib\request.js:38:9)
at Request.<anonymous> (D:\workspaces\typescript-starters\console-app\node_modules\aws-sdk\lib\request.js:690:12)
at Request.callListeners (D:\workspaces\typescript-starters\console-app\node_modules\aws-sdk\lib\sequential_executor.js:116:18)
我的解决方法只是从 sdk 中捕获异步错误,然后抛出一个新错误。此外,您可以将 Postgres 堆栈跟踪或错误消息附加到您自己的错误中。
async function getPersonFromDb (personId: string): Promise<DocumentClient.AttributeMap | undefined> {
const result = await documentClient.get({ // Similar to postgres.query()
TableName: 'wrong-name',Key: { pk: personId,sk: personId }
}).promise().catch(error => {
throw new Error(`Failed to get an item from DynamoDb. AWS Error: ${String(error.message)}`)
})
return result.Item
}
test('Get a person from DynamoDB',async () => {
const person = await getPersonFromDb('hello')
expect(person).not.toBeUndefined()
})
// ========= new stacktrace ========
Error: Failed to get an item from DynamoDb. AWS Error: Requested resource not found
at D:\workspaces\typescript-starters\console-app\test\abc.test.ts:12:13
at processTicksAndRejections (internal/process/task_queues.js:93:5)
at getPersonFromDb (D:\workspaces\typescript-starters\console-app\test\abc.test.ts:8:20)
at Object.<anonymous> (D:\workspaces\typescript-starters\console-app\test\abc.test.ts:18:20) // my code,and where my error is thrown