NestJS 导出连接,postgres 多租户

问题描述

我试图使用 postgres 实现多租户架构。它在租户服务上按预期工作。我想将此 CONNECTION 导入到一个名为 shop.How 的不同模块中。您当前看到的是租户模块。

import { TenantService } from './tenant.service';
    import { TenantController } from './tenant.controller';

import { Global,Module,Scope } from '@nestjs/common';
import { REQUEST } from '@nestjs/core';
import { Connection,createConnection,getConnectionManager } from 'typeorm';

import * as tenantsOrmconfig from '@config/typeorm/tenant-ormconfig';
import * as ormconfig from '@config/typeorm/ormconfig';
import { ShopModule } from './shop/shop.module';
import { AwsService } from '@config/aws';

const connectionFactory = {
  provide: 'CONNECTION',scope: Scope.REQUEST,useFactory: async (req) => {
    const teamId = req.headers['x-team-id'];
    console.log('xxxxxxxxxxxxxxxxxxx',teamId);

    if (teamId) {
      const connectionName = `${teamId}`;
      const connectionManager = getConnectionManager();

      if (connectionManager.has(connectionName)) {
        const connection = connectionManager.get(connectionName);
        return Promise.resolve(
          connection.isConnected ? connection : connection.connect(),);
      }

      return createConnection({
        ...tenantsOrmconfig,entities: [
          ...(tenantsOrmconfig as any).entities,...(ormconfig as any).entities,],name: connectionName,type: 'postgres',schema: connectionName,});
    }
  },inject: [REQUEST],};

@Module({
  imports: [ShopModule],controllers: [TenantController],providers: [connectionFactory,TenantService],exports: ['CONNECTION'],})
export class TenantModule {}

下面给出了它在tenantService中的使用方法

export class TenantService {
  gameRepository;
  constructor(@Inject('CONNECTION') connection) {
    this.gameRepository = connection.getRepository(TenantEntity);
   
  }

解决方法

我使用@Global() 装饰器解决了这个问题。它使租户模块全局化,以便它可以在项目中的任何地方导入。 在其他模块上导入它时,我使用了

imports: [forwardRef(() => TenantModule)],

#tenant 具有多租户连接属性的模块

@Global()
@Module({
  imports: [ShopModule],controllers: [TenantController],providers: [connectionFactory,TenantService],exports: ['CONNECTION'],})
export class TenantModule {}

#shop 模块,我需要选择架构

@Module({
  imports: [forwardRef(() => TenantModule)],controllers: [ShopController],providers: [ShopService,AwsService],})
export class ShopModule {}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...