我正在尝试实现多租户应用程序,它将收集组织的详细信息,组织数据将存储在不同的数据库中。
当有人执行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
级别连接到不同数据库的最佳方法是什么?
1条答案
按热度按时间7xzttuei1#
尝试检查https://github.com/needle-innovision/nestjs-tenancy
具有租户ID(来自标题)/子域实现的就绪解决方案。
不支持Graphql(2012年12月20日)。