【问题标题】:Dynamic MonoDB connection for child modules - NestJS子模块的动态 MonoDB 连接 - NestJS
【发布时间】:2022-12-20 08:18:11
【问题描述】:

我正在尝试实现多租户应用程序,它将收集组织详细信息,并且组织数据将存储在不同的数据库中。 像,

当有人调用 API 时,我将添加 x-org-id 标头,它将发送作为数据库名称的组织 ID。

我有2个模块

  1. 组织详细信息
  2. 用户

    我在 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 Injector 的服务,它看起来不起作用。当我在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 级别连接到不同数据库的最佳方式是什么?

【问题讨论】:

    标签: node.js mongodb mongoose nestjs nestjs-config


    【解决方案1】:

    尝试查看https://github.com/needle-innovision/nestjs-tenancy

    具有租户 ID(来自标头)/子域实施的现成解决方案。

    不支持 Graphql(20 年 12 月 20 日)。

    【讨论】:

      猜你喜欢
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      • 2020-03-23
      • 2020-12-01
      • 2021-01-22
      • 1970-01-01
      相关资源
      最近更新 更多