NestJS TypeORM 实体未加载完成服务就初始化报错的解决方案问询
NestJS搭配TypeORM启动时找不到实体的合理解决方案
该问题的核心原因是:NestJS的依赖注入、TypeORM的数据库连接初始化、实体注册流程均为异步操作,在类的
constructor执行时,上述流程还未完成,实体未被注册到默认连接中因此无法识别。setTimeout方案只是靠强制延迟等初始化完成,延迟时间受环境影响无法固定,稳定性极差,不推荐生产使用。
方案1:使用NestJS模块生命周期钩子(最推荐)
实现NestJS提供的OnModuleInit接口,将需要启动执行的逻辑放到onModuleInit方法中,该钩子会在当前模块所有依赖注入完成、关联初始化逻辑执行完毕后触发,此时TypeORM连接已经就绪、实体已完成注册。
代码示例:
如果你的初始化逻辑需要等整个应用所有模块都加载完成再执行,可以换成import { Injectable, OnModuleInit } from '@nestjs/common'; import { EntityA } from './entityA.entity'; @Injectable() export class ServiceA implements OnModuleInit { async onModuleInit() { // 初始化逻辑放在这里执行 await this.functionA(); } async functionA() { // 正常调用实体方法即可 return await EntityA.find(); } }OnApplicationBootstrap接口,实现onApplicationBootstrap方法,触发时机更靠后。方案2:检查TypeORM实体注册配置
很多时候该问题是实体未正确注册导致的,检查两处配置:- 根模块的
TypeOrmModule.forRoot配置中是否开启了autoLoadEntities: true,该配置会自动加载所有注册过的实体 - 用到对应实体的模块中,是否在
imports数组里通过TypeOrmModule.forFeature([EntityA])注册了当前模块用到的实体,漏加该配置会导致实体无法被关联到连接中
- 根模块的
方案3:主动注入连接实例判断就绪状态
如果确实有特殊场景需要提前执行逻辑,可以注入TypeORM的连接实例,主动判断连接就绪后再执行操作:import { Injectable } from '@nestjs/common'; import { InjectConnection } from '@nestjs/typeorm'; import { Connection } from 'typeorm'; import { EntityA } from './entityA.entity'; @Injectable() export class ServiceA { constructor(@InjectConnection() private connection: Connection) { this.init(); } async init() { // 等待连接就绪 if (!this.connection.isConnected) { await this.connection.connect(); } await this.functionA(); } async functionA() { // 也可以通过connection拿仓库,避免全局方法的不稳定问题 const repo = this.connection.getRepository(EntityA); return await repo.find(); } }
内容的提问来源于stack exchange,提问作者user16780074
相关产品推荐
相关产品推荐

