如何将服务注入导入的服务Nestjs

时间:2018-06-07 04:28:31

标签: nestjs

我的自定义模块r,s包含AuthModuleAuthService包含路由等等,工作正常,并且希望在多个项目之间作为包共享此模块。问题是如何从这个包中扩展导入的AuthController以及如何向其中注入额外的服务?

更多详情

我希望放入包中的自定义AuthService注入类AuthService,默认情况下会从数据库中获取一些UserService数据并将其返回给客户端。我需要从应用程序注入User另一个,例如来自数据库AuthService的额外数据ProfileService。目的是合并User主数据和User额外数据,并将此数据返回给客户

2 个答案:

答案 0 :(得分:1)

这是为其创建的用例Dynamic Modules之一。

import { Module, DynamicModule } from '@nestjs/common';
import { createDatabaseProviders } from './database.providers';
import { Connection } from './connection.provider';

@Module({
  providers: [Connection],
})
export class DatabaseModule {
  static forRoot(entities = [], options?): DynamicModule {
    const providers = createDatabaseProviders(options, entities);
    return {
      module: DatabaseModule,
      providers: providers,
      exports: providers,
    };
  }
}

在此示例中,查看如何(动态)向结果模块提供providers

您的软件包应遵循相同的模式:公开一个允许构建DynamicModule的静态方法,以便您可以根据需要解析其他服务(内部或外部)(构建自己的{{1}数组})。

答案 1 :(得分:0)

我认为这里真的不需要动态模块。

实际上,仅需要将要注入到NestJs管理的其他实体中的服务从AuthModule中导出,并将AuthModule导入到想要其他实体注入了AuthService的Module中。

import { Module } from '@nestjs/common'
import { AuthService } from './AuthService'

@Module({
  providers: [
    AuthService,
    // ... others
  ],
  exports: [
    AuthService
  ]
})
export class CommonModule {}

然后在您的依赖类中(假设是另一个Controller,但可以是GraphQL Resolver,Interceptor之类的东西),您可以声明对AuthService的依赖。

import { AuthService } from '../auth/AuthService'
import { Dependencies } from '@nestjs/common'

@Dependencies(AuthService)
export class DependentController {
  constructor (authService) {
    this.authService = authService
  }
}

最后,为了使AuthService可用于从属控制器,必须将其导入与提供控制器的模块相同。

import { Module } from '@nestjs/common'
import { CommonModule } from '../auth/CommonModule'
import { DependentController } from './controller/DependentController'

@Module({
  imports: [
    CommonModule,
    // ...others
  ],
  providers: [
    DependentController,
    // ...others
  ]
})
export class ControllerModule {}

我知道语法可能会更短,并且不会在打字稿中使用Dependencies装饰器,但是问题的核心是从提供的模块中导出共享服务,然后将该模块导入需要它的其他类中。