NestJS 请求多个数据库的范围多租户

nur*_*abe 5 multi-tenant nestjs

希望使用 NestJS 6 的新请求注入范围功能实现多租户 NestJS 解决方案。

对于任何给定的服务,我假设我可以做这样的事情:

@Injectable({scope: Scope.REQUEST})
export class ReportService implements OnModuleInit { ... }
Run Code Online (Sandbox Code Playgroud)

然后,在构造函数中,根据请求确定租户,连接到适当的数据库,并为新连接实例化存储库。

我想知道这是否是最直接的方法?

是否可以覆盖连接提供程序和请求范围而不是更新每个服务?

nur*_*abe 10

这就是我们最终要做的......

  1. 创建一个简单的全局TenancyModule绑定到请求范围:

租户.module.ts

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

const connectionFactory = {
  provide: 'CONNECTION',
  scope: Scope.REQUEST,
  useFactory: (req) => {
    const tenant = someMethodToDetermineTenantFromHost(req.headers.host);
    return getConnection(tenant);
  },
  inject: [REQUEST],
};

@Global()
@Module({
  providers: [connectionFactory],
  exports: ['CONNECTION'],
})
export class TenancyModule {}
Run Code Online (Sandbox Code Playgroud)
  1. 将特定'CONNECTION'于请求的模块服务注入到从中检索存储库的模块服务中:

用户服务.ts

...
@Injectable({scope: Scope.REQUEST})
export class UserService {
  private readonly userRepository: Repository<User>;

  constructor(@Inject('CONNECTION') connection) {
    this.userRepository = connection.getRepository(User);
  }
Run Code Online (Sandbox Code Playgroud)