请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于migration:generate时会出现cannot find module及migration指令相关的问题

关于migration:generate时会出现cannot find module相关的问题

在执行npm run migration:generate时会出现部分entity cannot find module问题,如下图
图片描述

经确认可能是因为必须要使用相对路径?
但因为vscode 结合 auto import插件在coding时会做自动引入,并且项目中tsconfig配置了baseurl:‘./’,所以自动引入都是绝对路径。

问题一
请问如果希望使用绝对路径的话,有解决方案吗?
使用绝对路径个人感觉有两个优点:

  • 代码优雅
  • 可读性更清晰

问题二
关于migration的在实际业务中使用的逻辑
疑问:

  1. 在实际项目中,migration:generate、migration:run等操作,是否应该只在生产服务器上操作执行?
  2. 因为在开发环境下,包括数据库也是开发环境,假设typeorm配置synchronize始终为true,那么数据库架构始终应该与本地entities自动同步,测试环境同理。也就是说,在部署到生产环境前,应该运行migration相关指令,并加载***生产环境下***的数据库连接信息,再去做相关操作?
  3. 因为根据所学知识,在运行migration相关指令时,无法区分node_env为“dev”还是“prod”,所以是否可以通过命令行传参(比较复杂的方式)或 通过在ormconfig配置文件内默认读取生产环境数据库信息方式来给migration提供连接数据库信息?

感谢老师赐教!

正在回答 回答被采纳积分+3

1回答

Brian 2023-12-19 20:37:55

我看了你的代码,有循环依赖:

AuditTrail -> User -> Role -> Menu -> AuditTrail


问题一:

请问如果希望使用绝对路径的话,有解决方案吗?——可以用啊,你有没有试过?


问题二
关于migration的在实际业务中使用的逻辑

疑问:

  1. 在实际项目中,migration:generate、migration:run等操作,是否应该只在生产服务器上操作执行?

——这些是方便开发的哦,一般我们在开发之前会做synchronize: true,开发完成之后,会关闭成false,后面如果要更新线上的数据库,也不是直接更新,除非是扩表,可能直接更新,如果是要修改一些字段,是需要有一个测试环境来进行测试之后,再进行线上的更新。更新一般会考虑用一个sql文件或者使用js的脚本来更新测试数据库,然后把测试数据库迁移过去。


2. 因为在开发环境下,包括数据库也是开发环境,假设typeorm配置synchronize始终为true

——错,一般要在线上把同步刚回去成false


3. 因为根据所学知识,在运行migration相关指令时,无法区分node_env为“dev”还是“prod”

——小伙伴,可以设置NODE_ENV来传参。


是否可以通过命令行传参(比较复杂的方式)或 通过在ormconfig配置文件内默认读取生产环境数据库信息方式来给migration提供连接数据库信息?

——可以,但是不觉得麻烦吗?node运行ormconfig配置的时候,是可以拿到env环境变量的啊。

0 回复 有任何疑惑可以回复我~
  • 提问者 幕布斯2449755 #1
    我避免了循环依赖问题后,依旧无法正常运行migration:generate
    
    https://stackoverflow.com/questions/66991600/typeorm-migration-error-cannot-find-module
    
    此篇文章有讲到有提到,使用相对路径可解决cannot find module这个问题。另外,有发现使用tsconfig-path/register包是不是可以解决migration运行时找不到路径的问题?尝试了下不太会配置。
    
    另外关于循环依赖的问题,为什么在npm run start:dev及npm run build时都是正常,并不会报错?
    
    AuditTrail是我定义的一个实体基类,里面有createAt、updateAt、createBy、updateBy通用字段,并会在typeorm的eventsubscriber中监听新增或更新操作时,自动写入相关值,在查询时直接通过指定relations联查出createBy、updateBy很方便。
    
    我在UserEntity中定义了roles并建立了中间表(依赖了RoleEntity),因为RoleEntity extends了AuditTrail,AuditTrail中的createBy字段又是一个外键,建立了与UserEntity的多对多关系,综上形成了循环依赖。
    
    针对循环依赖问题,我尝试了两张解决方案,如下:
    1. 当我尝试把一些createAt、updateAt、createBy、updateBy通用字段写在各自的实体中,避免各实体extends AuditTrail,感觉在定义时很不方便
    2. 我尝试在AuditTrail中将createBy、updateBy设为普通column,避免这两个字段成为外键(@joincolumn),发现在查询时,都需要手动去关联了,也很麻烦
    
    请问老师有什么通用的解决方案吗
    回复 有任何疑惑可以回复我~ 2023-12-20 10:05:57
  • 提问者 幕布斯2449755 #2
    ---
    回复 有任何疑惑可以回复我~ 2023-12-20 10:08:52
  • Brian 回复 提问者 幕布斯2449755 #3
    我建议使用相对路径。
    
    有发现使用tsconfig-path/register包是不是可以解决migration运行时找不到路径的问题?尝试了下不太会配置。——不推荐
    
    1. 当我尝试把一些createAt、updateAt、createBy、updateBy通用字段写在各自的实体中,避免各实体extends AuditTrail,感觉在定义时很不方便
    ——你可以定义一个基类
    
    2. 我尝试在AuditTrail中将createBy、updateBy设为普通column,避免这两个字段成为外键(@joincolumn),发现在查询时,都需要手动去关联了,也很麻烦
    ——如果两个类中的属性不同,可以单独在这个类中定义
    回复 有任何疑惑可以回复我~ 2023-12-20 16:08:20
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信