TypeOrmModule 从 app.module.ts 抽离到 database.module.ts 后出现错误的原因分析

简介: 本文分析了TypeORM实体元数据错误的成因,主要涉及实体注册方式、路径解析差异及模块结构变化导致的关系解析问题,并提供了具体解决方案和最佳实践建议。

TypeORM 实体元数据错误问题分析

问题原因

这个问题的根本原因在于 实体的注册方式和路径解析 的差异:

  1. 路径解析方式不同 :

    • 在原始的 app.module.ts 中,实体路径是这样配置的:
      entities: [__dirname + '/common/entities/*.entity{.ts,.js}'],
      
    • 而在 database.module.ts 中,实体路径是这样配置的:
      entities: [path.join(__dirname, '../../common/entities/*.entity{.ts,.js}
      ')],
      
  2. autoLoadEntities 与实体注册 :

    • 两个文件都设置了 autoLoadEntities: true ,但这个选项的工作方式依赖于模块结构
    • 当你在 app.module.ts 中配置 TypeORM 时,所有的实体模块(如 GoodsModule)都是 AppModule 的直接子模块,TypeORM 可以自动发现并注册所有实体
    • 当你抽离到 database.module.ts 后,TypeORM 需要明确知道所有实体之间的关系
  3. 实体关系问题 :

    • Goods 实体和 GoodsType 实体之间存在双向关系( @OneToMany 和 @ManyToOne )
    • 在 GoodsModule 中,只导入了 Goods 实体,但没有导入 GoodsType 实体
    • 当 TypeORM 尝试解析 Goods#types 关系时,找不到 GoodsType 的元数据

解决方案

通过修改 GoodsModule 来解决这个问题,添加了所有相关实体的导入:

@Module({
  imports: [TypeOrmModule.forFeature([Goods, GoodsBanner, CategoryRecommend, 
  GoodsCategory, GoodsType, GoodsAttr, GoodsSkuCard])],
  controllers: [GoodsController],
  providers: [GoodsService],
})
export class GoodsModule { }

为什么在 app.module.ts 中没有问题?

在 app.module.ts 中没有问题的原因是:

  1. 路径解析更直接 : __dirname + '/common/entities/*.entity{.ts,.js}' 路径解析更直接,不容易出现路径错误
  2. 模块结构更扁平 :所有模块都是 AppModule 的直接子模块,TypeORM 可以更容易地发现所有实体
  3. 实体加载时机 :在原始结构中,所有实体可能在同一时间被加载和处理,而在抽离后的结构中,实体加载顺序可能发生变化

最佳实践建议

  1. 确保在每个功能模块中导入该模块使用的所有实体,包括关联实体
  2. 考虑在 database.module.ts 中使用绝对路径而非相对路径:

    entities: [process.cwd() + '/dist/common/entities/*.entity.js'],
    
  3. 如果实体之间有复杂的关系,考虑在一个集中的地方注册所有实体,确保它们都被正确加载
目录
相关文章
|
1月前
|
JSON 监控 数据格式
1688 item_search_app 关键字搜索商品接口深度分析及 Python 实现
1688开放平台item_search_app接口专为移动端优化,支持关键词搜索、多维度筛选与排序,可获取商品详情及供应商信息,适用于货源采集、价格监控与竞品分析,助力采购决策。
|
1月前
|
缓存 监控 Android开发
京东 item_get_app 接口深度分析及 Python 实现
京东item_get_app接口可获取商品原始详情数据,包含更丰富的字段和细节,适用于电商分析、价格追踪等场景。需通过认证获取权限,支持字段筛选和区域化数据查询。
|
2月前
|
缓存 数据挖掘 API
淘宝 item_get_app 接口深度分析及 Python 实现
淘宝item_get_app接口是淘宝开放平台提供的移动端商品详情数据获取接口,相较PC端更贴近APP展示效果,支持获取APP专属价格、促销活动及详情页结构,适用于电商导购、比价工具、数据分析等场景。接口采用appkey+appsecret+session认证机制,需申请相应权限。本文提供Python调用示例及使用注意事项,帮助开发者高效对接移动端商品数据。
|
1月前
|
缓存 供应链 开发者
1688 item_get_app 接口深度分析及 Python 实现
1688平台item_get_app接口专为移动端设计,提供商品原始详情数据,包含批发价格、起订量、供应商信息等B2B特有字段,适用于采购决策、供应链分析等场景。接口需通过appkey+access_token认证,并支持字段筛选,返回结构化数据,助力企业实现智能采购与供应商评估。
|
2月前
|
数据采集 数据可视化 API
驱动业务决策:基于Python的App用户行为分析与可视化方案
驱动业务决策:基于Python的App用户行为分析与可视化方案
|
6月前
|
数据采集 数据可视化 数据挖掘
基于Python的App流量大数据分析与可视化方案
基于Python的App流量大数据分析与可视化方案
【Azure 应用服务】App Service频繁出现 Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener 异常分析
【Azure 应用服务】App Service频繁出现 Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener 异常分析
122 2
|
11月前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
195 5
|
安全
【Azure App Service】App service无法使用的情况分析
App Service集成子网后,如果子网网段中的剩余IP地址非常少的情况下,会在App Service实例升级时( 先加入新实例,然后在移除老实例 )。新加入的实例不能被分配到正确的内网IP地址,无法成功的访问内网资源。 解决方法就是为App Service增加子网地址, 最少需要/26 子网网段地址。
135 4
【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
102 2

热门文章

最新文章