NodeJS 子模块的动态MonoDB连接- NestJS

ogq8wdun  于 2022-12-22  发布在  Node.js
关注(0)|答案(1)|浏览(131)

我正在尝试实现多租户应用程序,它将收集组织的详细信息,组织数据将存储在不同的数据库中。
当有人执行API调用时,我将添加x-org-id标头,它将发送org ID,即数据库名称。
我有2个模块
1.组织明细
1.用户
我在app.module.ts上添加了数据库连接,如下所示

@Module({
  imports: [
    MongooseModule.forRoot(process.env.DB),
    OrgModule,
    UserModule
  ],
  controllers: [],
  providers: [],
})

process.env.DB将具有类似于mongodb://localhost/my_master_db的主数据库连接。当创建组织时,我将把my_master_db数据库中的数据保存在org_details集合中。从这里,我将获得由MongoDB生成的_id,并将其用作保存用户的数据库名称。
所有组织相关的API将在http://localost:3000/org端点。在这里我想连接到my_master_db
所有与用户相关的API端点都将位于http://localost:3000/user中,这里我想将数据库连接从API请求头x-org-id更改为mongodb://localhost2/{org_id}
我试过THIS解决方案,通过创建一个使用Scope.REQUEST注入器的服务,它看起来不工作。当我在app.module.ts上使用它时,它工作,但当我在user.module.ts上导入它时,它不工作。
我的mongoose.service.ts文件如下所示

import { Inject, Injectable, Scope } from '@nestjs/common';
import { MongooseOptionsFactory, MongooseModuleOptions } from '@nestjs/mongoose';
import { REQUEST } from '@nestjs/core';
import { Request } from '@nestjs/common';

@Injectable({ scope: Scope.REQUEST })
export class MongooseConfigService implements MongooseOptionsFactory {
    constructor(
        @Inject(REQUEST) private readonly request: Request) {
            console.log("Injected", "Injected");
    }

    createMongooseOptions(): MongooseModuleOptions {
        return {
             uri: this.request.headers['x-org-id'],
        };
    }
}

我的db.module.ts文件如下所示

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { MongooseConfigService } from './mognoose.service';

@Module({
    imports: [
        MongooseModule.forRootAsync({
            useClass: MongooseConfigService,
        }),
    ]
})
export class DbModule {}

我将DbModule导入到我的UserModule,如下所示

@Module({
  imports: [
    MongooseModule.forFeature([{ name: "users", schema: UserModel}]),
    HrmDbModule,
  ],
  controllers: [UserController],
  providers: [UserProvider]
})

如何解决此问题?在router级别连接到不同数据库的最佳方法是什么?

7xzttuei

7xzttuei1#

尝试检查https://github.com/needle-innovision/nestjs-tenancy
具有租户ID(来自标题)/子域实现的就绪解决方案。
不支持Graphql(2012年12月20日)。

相关问题