【发布时间】:2022-12-20 08:18:11
【问题描述】:
我正在尝试实现多租户应用程序,它将收集组织详细信息,并且组织数据将存储在不同的数据库中。 像,
当有人调用 API 时,我将添加 x-org-id 标头,它将发送作为数据库名称的组织 ID。
我有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.REQUESTInjector 的服务,它看起来不起作用。当我在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