1、异常过滤器、拦截器中无法注入自己写的模块,只能注入nest自己的模块,如Logger
2、守卫等功能不是完整的模块,不能通过设置为全局来免除手动对其中的外部模块的注入
3、app.module下引入的模块,并不等于全局。
例:业务模块要使用HttpModule,依然要自己导入。
4、遇到无法理解的问题,可以试试重装依赖。
5、定时任务中不能引用请求相关功能,否则无法启动
问题:编写nest 定时任务时,按照官方文档写的tasks.service中无法进行依赖注入。
通过最小化问题模型,发现问题在于:只要定时任务中调用(含注入)、间接调用TypeOrm,就会发生注入失败。
继续寻根:
=> TypeOrmModule在注册时引用了UtilsModule(一个普通工具module)
=> UtilsModule中的Logger中注入使用了@nestjs/core包的 REQUEST 对象
nest的定时任务@nestjs/schedule采用的是无上下文设计,这和egg.js是不一样的。
由此可得解决方案:
a. 对定时任务做分离,单开一个项目。接口的db log保留请求信息,定时任务的db log不需要包含请求信息。
b. db logger统一不保留请求信息
在当前项目中我选择方案b,对于必要的日志,通过手动输出来完成。
6、nest+typeorm系统中,如果发生数据库网络中断导致的查询失败,连接池会进入永久不可用状态,而不会自动重连
这是其他框架没有遇到过的情况,在多个项目中测试,已证明具有普遍性。