简单一句话:你可能需要使用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]
找原因:一个头两个大
这当中各种找GPT问问题,他给的啥啊,啥也不是。
我在app.module.ts里各种注释imports里的modules。发现只要我把所有的业务modules全注释了就能跑起来了。
怀疑1:循环引用出问题了。
我感觉是我可能有循环引用,我开始清理modules里面的import,provide。仔细找了一圈发现所有引用都正常,我于是只开了两个业务Module。User+UserRole还是跑不起来,关联关系也不复杂。
怀疑2:npm 抽风了
所以果断删除node_modules ,dist ,logs, package-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 后,程序正常启动,也不会出现问题,至此一个很奇葩,抽风问题解决了。