为啥 NestJS mysql 查询错误不包含所有执行上下文但在 process._tickCalback 处停止?

Posted

技术标签:

【中文标题】为啥 NestJS mysql 查询错误不包含所有执行上下文但在 process._tickCalback 处停止?【英文标题】:Why NestJS mysql query error does not contain all the execution context but stops at process._tickCalback?为什么 NestJS mysql 查询错误不包含所有执行上下文但在 process._tickCalback 处停止? 【发布时间】:2021-07-30 16:22:32 【问题描述】:

更新: 似乎 Node.js v1014.15.0 的堆栈跟踪存在一些错误。我的问题在更新到 14.16.1 后得到解决。 Check here some of the related issues

一个复制这个问题的小项目: https://github.com/babaliaris/nestjs-error-context-problem

this is the line that the stack trace does not mention

我有一个这样的调用执行:

1) users.controller.ts calls await insert(table_name, query, data) inside a try-catch block.
2) mysql.service.ts implements the insert() method which calls
3) mysql.query() an npm module that rejects a promise due to a non-existing table name.

我得到的堆栈跟踪如下:

[Nest] 31018   - 05/08/2021, 6:55:20 PM   [POST /api/users] Internal Error +20932ms
Error: ER_NO_SUCH_TABLE: Table 'agro_ajenda_test.t_user' doesn't exist
    at Query.Sequence._packetToError (/home/babaliaris/Development/web/nestjs/agro-ajenda-backend/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)
    at Query.ErrorPacket (/home/babaliaris/Development/web/nestjs/agro-ajenda-backend/node_modules/mysql/lib/protocol/sequences/Query.js:79:18)
    at Protocol._parsePacket (/home/babaliaris/Development/web/nestjs/agro-ajenda-backend/node_modules/mysql/lib/protocol/Protocol.js:291:23)
    at Parser._parsePacket (/home/babaliaris/Development/web/nestjs/agro-ajenda-backend/node_modules/mysql/lib/protocol/Parser.js:433:10)
    at Parser.write (/home/babaliaris/Development/web/nestjs/agro-ajenda-backend/node_modules/mysql/lib/protocol/Parser.js:43:10)
    at Protocol.write (/home/babaliaris/Development/web/nestjs/agro-ajenda-backend/node_modules/mysql/lib/protocol/Protocol.js:38:16)
    at Socket.<anonymous> (/home/babaliaris/Development/web/nestjs/agro-ajenda-backend/node_modules/mysql/lib/Connection.js:88:28)
    at Socket.<anonymous> (/home/babaliaris/Development/web/nestjs/agro-ajenda-backend/node_modules/mysql/lib/Connection.js:526:10)
    at Socket.emit (events.js:198:13)
    at addChunk (_stream_readable.js:288:12)
    --------------------
    at Protocol._enqueue (/home/babaliaris/Development/web/nestjs/agro-ajenda-backend/node_modules/mysql/lib/protocol/Protocol.js:144:48)
    at Connection.query (/home/babaliaris/Development/web/nestjs/agro-ajenda-backend/node_modules/mysql/lib/Connection.js:198:25)
    at connect.then (/home/babaliaris/Development/web/nestjs/agro-ajenda-backend/dist/services/mysql/mysql.service.js:27:22)
    at process._tickCallback (internal/process/next_tick.js:68:7)

最后一个上下文是

at process._tickCallback (internal/process/next_tick.js:68:7)

但应该是这样的

at insert() (/home/babaliaris/Development/web/nestjs/agro-ajenda-backend/dist/controllers/users/users.controller.js:27:22)

由于某种原因,它没有告诉我在哪里发现了错误,但堆栈停止了 在那个 process._tickCalback

其他 mysql.MysqlErrorER_BAD_DB_ERROR 包含来自 users.controller.js 文件的调用,但 ER_NO_SUCH_TABLE没有!

发生了什么事?

【问题讨论】:

我只是用不同的输出运行你的代码:在 AppService.insert (/xxx/dist/app.service.js:33:16) at processTicksAndRejections (internal/process/task_queues.js:97: 5) 在异步 AppController.getHello (xxx/dist/app.controller.js:23:20) 【参考方案1】:

更新

节点v10.24.0存在这个bug,升级节点到12+即可解决。


正如我在评论中所说,我有不同的结果。 所以我检查了不同的节点版本,发现 v10 没有正确处理错误并返回你提到的相同错误。

请问您使用的是节点 10 吗?

如果是,您可以尝试下一个 LTS node 12latest node 16 看看问题是否消失。

【讨论】:

是的,我当前的节点版本是v10.24.0。哇,我更新到了下一个稳定版本v14.16.1,它可以工作了!!!所以这不是我的错误!这是我第一次遇到这种情况,当我遇到问题时通常 100%,错误是我的错,而不是我使用的技术。 您可以编辑您的答案以在节点v10.24.0 中提及此错误。我接受了你的回答!

以上是关于为啥 NestJS mysql 查询错误不包含所有执行上下文但在 process._tickCalback 处停止?的主要内容,如果未能解决你的问题,请参考以下文章

为啥白名单不会出现错误模型 NestJs 的错误

为啥 MySql 会出现“子查询返回超过 1 行”错误?

NestJS + MySQL:如何在不设置实体的情况下连接多个数据库

查询在 mysql 工作台中有效,但在 php 中无效,不知道为啥

elastic APM 和 NestJS 不区分 graphql 查询

nestjs为啥不火