使用mongoose的Nestjs多数据库连接

pxy2qtax  于 2023-04-21  发布在  Go
关注(0)|答案(1)|浏览(246)

我有一个数据库,其中包含帐户(帐户、用户、角色、权限等)以及与帐户相关的流程和进程。如果客户希望,我们将尝试为客户端数据(在本例中为流程和进程)创建不同的数据库。
如果账户数据有一个特定的mongo uri,它应该使用它来处理流,否则它应该使用正常的连接。
我们有一个guard来验证用户并获取他的帐户,并希望在调用guard之后连接到正确的数据库,但是MongooseService在guard之前被调用,因为它在app.module.ts中,因此uri信息是空的:

MongooseModule.forRootAsync({
      connectionName: 'customer',
      useClass: MongooseService,
    }),

MongooseService有:

@Injectable({ scope: Scope.REQUEST })
export class MongooseService implements MongooseOptionsFactory {
  constructor(@Inject(REQUEST) private readonly request: IRequest) {}

  createMongooseOptions(): MongooseModuleOptions {
    console.log(
      'MongooseService',
      this.request.date,
      this.request.url,
      this.request.user,
    );
    if (this.request.user.uri) {
      return {
        uri: this.request.user.url,
        useNewUrlParser: true,
        useUnifiedTopology: true,
      };
    } else {
      return { uri: // get uri from .env };
    }
  }
}

我们的警卫有这个:

...
      // validate token
      const token = this.getToken(request);
      const jwtData = this.jwtService.verify<IJwtData>(token);
...
      let user = await this.teamService.findOne(jwtData.id);
      request.user = user;
...

有没有使用这种策略,使用连接名称(https://docs.nestjs.com/techniques/mongodb#multiple-databases),或者因为我们需要数据库中的数据,所以我们需要使用不同的方法?
先谢谢你,佩德罗

gg58donl

gg58donl1#

您需要在Guard中为MongooseServiceinject创建一个自定义提供者,这样就可以在调用Guard后示例化MongooseService,用户数据可用

import { Provider } from '@nestjs/common';
import { MongooseService } from './mongoose.service';
import { ConfigService } from '@nestjs/config';

export const MongooseProvider: Provider = {
  provide: MongooseService,
  useFactory: (req: IRequest) => {
    console.log(
      'MongooseService',
      req.date,
      req.url,
      req.user,
    );
    if (req.user.uri) {
      return {
        uri: req.user.url,
        useNewUrlParser: true,
        useUnifiedTopology: true,
      };
    } else {
      return { uri: ConfigService.get("MY_ENV_URL"}; // get uri from .env
    }
  },
  inject: [REQUEST],
};

相关问题