【番外:一个NestJS的后端从0到1】TypeORM+Mysql奇奇怪怪

250 阅读3分钟

简单一句话:你可能需要使用mysql 8.0

背景:我的Mysql是用宝塔面板管理跑在阿里云上。

正常的Nest启动应该会在控制台这样显示:

[Nest] 10061  - 2024/06/17 16:53:48     LOG [NestFactory] Starting Nest application...
[Nest] 10061  - 2024/06/17 16:53:48     LOG [InstanceLoader] TypeOrmModule dependencies initialized +10ms
[Nest] 10061  - 2024/06/17 16:53:48     LOG [InstanceLoader] PassportModule dependencies initialized +0ms
[Nest] 10061  - 2024/06/17 16:53:48     LOG [InstanceLoader] HttpModule dependencies initialized +0ms
[Nest] 10061  - 2024/06/17 16:53:48     LOG [InstanceLoader] WinstonModule dependencies initialized +1ms
[Nest] 10061  - 2024/06/17 16:53:48     LOG [InstanceLoader] ConfigHostModule dependencies initialized +0ms
//... 一些业务Module的InstanceLoader
//...  打印路由了
[NestJS] - 2024/6/17 16:53:49     LOG [RoutesResolver] UserAuthController {/xxx}:
[NestJS] - 2024/6/17 16:53:49     LOG [RouterExplorer] Mapped {/xxx/yyy, POST} route
//... 输出启动成功
[NestJS] - 2024/6/17 16:53:49     LOG [NestApplication] Nest application successfully started

问题:NestJS启动了,但又没启动。

最开始用的是mysql_mariadb_10.7。因为有一些其他的demo跑的是这个也没遇到什么问题,所以就直接没改。

但是这两天奇奇怪怪,吭哧吭哧写完代码跑了项目,结果http服务都没起来。 控制台像暂停了一样,卡着不动,按道理来说 后面应该还要有[RouterResolver] 和 [RouterExplorer] image.png

找原因:一个头两个大

这当中各种找GPT问问题,他给的啥啊,啥也不是。

我在app.module.ts里各种注释imports里的modules。发现只要我把所有的业务modules全注释了就能跑起来了。

怀疑1:循环引用出问题了。

我感觉是我可能有循环引用,我开始清理modules里面的import,provide。仔细找了一圈发现所有引用都正常,我于是只开了两个业务Module。User+UserRole还是跑不起来,关联关系也不复杂。

怀疑2:npm 抽风了

所以果断删除node_modulesdist ,logspackage-lock.json 文件,重新npm install 再启动。无济于事

怀疑3: 我今天到底动哪里了

code diff 找了很久,真的没啥动的,配置了一些环境变量。修改了文件目录。调整了Guards。我把我动到的地方该注释的注释。还是没找到问题。依旧跑不起来

怀疑4:数据库是不是初始化有问题.

因为加了一个初始化数据库的操作,在启动前会给user表中增加默认的一条用户数据,但是这条在我之前被我注释掉过,也没效果。后面用 Navicat连下数据库卡死了。于是上服务器重启了mysql服务,TMD 应用跑起来了。

找到问题了,但是似乎又没找到

最后定位在数据库的问题上,为啥会有这种问题,我也不是很清楚。能定位到问题已经离成功不远了。

于是我后续还是出现过几次应用卡着,重启数据库服务就好了。但是我没做数据库的表结构更改,不知道为啥会卡死。

尝试解决这个问题

所以我索性把mysql的版本改成5.7,我的噩梦又来了。 连上新的数据库后,总共有以下几个问题:

  • entity找不到。发现entity只要改名字就好了很奇葩,解决:配置项增加了entityPrefix:'t_'
  • createTime default value 问题。将createTime和updateTime的装饰器@UpdateDateColumn() @CreateDateColumn() 改成 @Column
  • 初始化数据库外键问题; 这个在代码里面事务提交,按理来说不会有任何问题,但是就是报错了。所以我想着换下mysql版本,改成 8.0

最终

将Mysql版本改成8.0 后,程序正常启动,也不会出现问题,至此一个很奇葩,抽风问题解决了。