NestJS连接双MySQL数据库报错:EntityMetadataNotFoundError求助
解决NestJS多数据库连接的EntityMetadataNotFoundError问题
问题根源
当前配置存在两个核心问题:
- 未给每个数据库连接指定唯一
name标识,Nest无法区分不同连接池 - 两个连接都加载了所有实体,导致实体与数据库不匹配,元数据混乱
修复步骤
1. 为每个数据库连接添加唯一名称并指定对应实体
修改根模块的TypeOrm配置,给每个连接加上唯一name,同时限制entities只加载对应数据库的实体:
imports: [ TypeOrmModule.forRoot({ name: 'usersConnection', // 唯一连接名称 type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: 'password', database: 'users_db', entities: [User], // 仅加载users_db对应的实体 synchronize: true, }), TypeOrmModule.forRoot({ name: 'productsConnection', // 唯一连接名称 type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: 'password', database: 'products_db', entities: [Product], // 仅加载products_db对应的实体 synchronize: true, }), UsersModule, ProductsModule, ],
2. 在业务模块中指定使用的连接
在UsersModule中,使用forFeature时绑定对应的连接名称:
@Module({ imports: [TypeOrmModule.forFeature([User], 'usersConnection')], providers: [UsersService], controllers: [UsersController], }) export class UsersModule {}
同理,ProductsModule绑定productsConnection:
@Module({ imports: [TypeOrmModule.forFeature([Product], 'productsConnection')], providers: [ProductsService], controllers: [ProductsController], }) export class ProductsModule {}
3. 在Service中注入对应连接的Repository
在ProductsService中,注入Repository时指定连接名称:
@Injectable() export class ProductsService { constructor( @InjectRepository(Product, 'productsConnection') private productRepository: Repository<Product>, ) {} // 业务逻辑代码... }
关键说明
- 每个数据库连接必须配置唯一
name,Nest通过该标识区分不同连接池 - 实体需与数据库一一对应,避免跨库加载实体导致元数据匹配错误
- 使用
@InjectRepository时必须指定连接名称,否则会默认使用第一个初始化的连接
内容的提问来源于stack exchange,提问作者m mohammadi
相关产品推荐
相关产品推荐

