TypeOrm:在父类中创建连接并在不起作用的子代中使用

时间:2018-12-17 19:43:40

标签: typescript typeorm

我有一组微服务,试图将其转换为TypeOrm,并看到一些奇怪的行为。我有一个父类BaseService来处理创建连接(为了实现我们需要的多租户,它将管理对Db / Schema组合的新连接创建或服务现有连接)。连接的创建似乎运行良好:仅作比较,我在微服务本身中手动创建了一个连接,传入的连接似乎与手动创建的连接相同。但是,当使用传入的连接调用dbConnection.getCustomRepository(...)时,我得到一个空对象,而使用手动创建的连接调用相同的对象就可以了。我对连接管理的作用域不了解...是否无法像使用knex这样传递连接对象?即使我在连接实例上调用getCustomRepository时,它是否实际上也在使用全局连接管理器?多谢您提供帮助。

编辑:只是为了获得更多代码上下文,以防万一...

这不起作用(widgetRepository为空):

async getWidgets(dbConnection, query): Promise < Widget[] > {
  const widgetRepository: WidgetRepository = dbConnection.getCustomRepository(
    WidgetRepository
  );
  return widgetRepository.getWidgets();
}

这确实有效:

async getWidgets(dbConnection, query): Promise < Widget[] > {
  const testConnection = await createConnection({
    ...
  }); //inspecting this appears to be identical to dbConnection
  const widgetRepository: WidgetRepository = testConnection.getCustomRepository(
    WidgetRepository
  );
  return widgetRepository.getWidgets();
}

(传入的dbConnection的创建方法与testConnection完全相同,只是在另一个包中存在的父类中创建

1 个答案:

答案 0 :(得分:0)

好吧,我想我找到了发生这种情况的原因……以及一个不错的解决方案。负责的代码在这里:https://github.com/typeorm/typeorm/blob/master/src/entity-manager/EntityManager.ts#L790if (entityRepositoryInstance instanceof Repository) {...}),我想它失败了,因为它正在针对不同的Repository实例进行检查(因为每个项目都必须导入自己的typeorm)。对我有用的解决方案是只在我的单个项目(负责创建和管理连接的项目)中重新导出typeorm。