问题描述
我试图使用 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 {}