TypeORM通过getMetadataArgsStorage()获取实体时新增@Entity类不识别如何解决
根本原因
getMetadataArgsStorage() 是TypeORM的内部元数据存储容器,仅会收录已经被Node.js运行时加载过、且@Entity装饰器已经执行完成的实体。你的新实体没有被项目加载链路引入过,装饰器逻辑未执行,自然不会出现在返回的tables列表中。
解决方案
- 方案1:替换为官方推荐的实体加载方式(最稳妥)
放弃手动读取元数据的写法,直接用路径匹配规则让TypeORM自动加载所有实体,配置修改为:
该方式会自动扫描指定路径下的所有实体文件,无需手动维护列表。config = { type: 'postgres', host: 'localhost', port: 5432, username: 'xxxx', password: 'xxxx', database: 'xxxx', // 开发环境匹配src下的entity文件,生产环境替换为dist目录路径即可 entities: ['src/**/*.entity{.ts,.js}'], synchronize: true, }; - 方案2:保留现有逻辑,主动导入所有实体
如果你必须使用getMetadataArgsStorage()的写法,需要确保所有实体都被主动加载:- 新增
src/entities/index.ts文件,将所有实体(包括新增的NewEntity)都在该文件中导出:
export * from './path/to/old-entity1'; export * from './path/to/old-entity2'; export * from './path/to/new-entity'; // 新增实体必须加入该列表- 在数据库配置文件的最开头引入该文件,保证所有实体的装饰器在读取元数据前执行完成:
import './entities'; // 后续再写你的数据库配置逻辑 - 新增
- 方案3:清理编译缓存重试
如果是本地开发环境开了增量编译/热重载,可能存在新文件未被加载的情况,删除dist目录后全量重新编译启动项目即可。
注意:
synchronize: true仅可在本地开发环境使用,生产环境开启会自动抹除差异数据,必须使用TypeORM迁移功能做表结构更新。
内容的提问来源于stack exchange,提问作者charles-emile begin lavigne
相关产品推荐
相关产品推荐

