从玩笑中获取正确的堆栈跟踪

问题描述

我目前正在调试一些在打字稿上用玩笑编写的测试,我有点头疼。

如果测试或测试类运行 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