为啥 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 v10 到 14.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.MysqlError 如 ER_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 12
或 latest node 16
看看问题是否消失。
【讨论】:
是的,我当前的节点版本是v10.24.0
。哇,我更新到了下一个稳定版本v14.16.1
,它可以工作了!!!所以这不是我的错误!这是我第一次遇到这种情况,当我遇到问题时通常 100%,错误是我的错,而不是我使用的技术。
您可以编辑您的答案以在节点v10.24.0
中提及此错误。我接受了你的回答!以上是关于为啥 NestJS mysql 查询错误不包含所有执行上下文但在 process._tickCalback 处停止?的主要内容,如果未能解决你的问题,请参考以下文章
NestJS + MySQL:如何在不设置实体的情况下连接多个数据库
查询在 mysql 工作台中有效,但在 php 中无效,不知道为啥