从另一个模块注入nestjs服务

Fai*_*wen 20 javascript node.js nestjs

我有一个PlayersModule和一个ItemsModule.

我想用ItemsServicePlayersService.

当我通过注射添加它时:

import { Injectable } from '@nestjs/common';
import { InjectModel } from 'nestjs-typegoose';
import { ModelType, Ref } from 'typegoose';
import { Player } from './player.model';
import { Item } from '../items/item.model';
import { ItemsService } from '../items/items.service';

@Injectable()
export class PlayersService {
    constructor(
        @InjectModel(Player) private readonly playerModel: ModelType<Player>,
        private readonly itemsService: ItemsService){}
Run Code Online (Sandbox Code Playgroud)

我得到这个嵌套错误:

[Nest] 11592 - 2018-8-13 11:42:17 [ExceptionHandler] Nest无法解析PlayersService(+ ,?)的依赖关系.请确保索引[1]的参数在当前上下文中可用.

两个模块都导入了app.module.ts.这两项服务都在他们的模块中单独工作.

Kim*_*ern 44

您必须ItemsService在提供它的模块中导出:

@Module({
  controllers: [ItemsController],
  providers: [ItemsService],
  exports: [ItemsService]
  ^^^^^^^^^^^^^^^^^^^^^^^
})
export class ItemsModule {}
Run Code Online (Sandbox Code Playgroud)

然后在使用该服务的模块中导入它:

@Module({
  controllers: [PlayersController],
  providers: [PlayersService],
  imports: [ItemsModule]
  ^^^^^^^^^^^^^^^^^^^^^^
})
export class PlayersModule {}
Run Code Online (Sandbox Code Playgroud)

  • 试图导入服务本身,结果导入模块本身起作用。谢谢 (3认同)
  • @nasta 你还需要在 PlayersService 中额外导入服务吗?即`import { ItemsService } from '../items/items.service';`。另外,我们这里在构造函数中使用了某种装饰器吗?`@Inject 私有只读 itemsService: ItemsService` (3认同)
  • 我使用了@KimKern的建议,仍然看到注入的服务无法识别的错误。 (2认同)

小智 42

假设您想在我的 TaskModule 控制器中使用 AuthModule 中的 AuthService

为此,您需要从 AuthModule 导出 authService

@Module({
    imports: [
     ....
    ],
    providers: [AuthService],
    controllers: [AuthController],
    exports:[AuthService]
  })
export class AuthModule {}
  
Run Code Online (Sandbox Code Playgroud)

然后在TaskModule中,需要导入AuthModule(注意:导入AuthModule而不是TaskModule中的AuthService)

@Module({
    imports:[
      AuthModule
    ],
    controllers: [TasksController],
    providers: [TasksService]
  })
export class TasksModule {}
Run Code Online (Sandbox Code Playgroud)

现在您应该能够在 TaskController 中使用 DI

@Controller('tasks')
export class TasksController {
   constructor(private authService: AuthService) {}
   ...
}
  
Run Code Online (Sandbox Code Playgroud)


小智 16

金·科恩 (Kim Kern) 回答了这个问题。但我只是想提醒阅读此评论的人们。每当出现此错误时,您应该按照以下步骤操作,这些步骤可以帮助您轻松找出卡住的位置:

  • 确保提供提供者的模块已导入。
  • 确保您使用的提供程序已导出。

例如,您有包含类别服务的类别模块,发布模块有发布服务,并且它有类别服务作为依赖项:

@Module({
    controllers: [CategoryController],
    providers: [CategoryService],
    exports: [CategoryService] // Remember to export
  })
export class CategoryModule {}
Run Code Online (Sandbox Code Playgroud)

@Module({
    imports: [CategoryModule], // Make sure you imported the module you are using
    controllers: [PostController],
    providers: [PostService]
  })
export class PostModule {}
Run Code Online (Sandbox Code Playgroud)

不要忘记使用这个注释。Nest 使用它来检测单例类。在Spring Boot-Java中,这个曾经被称为Bean。阅读更多:

@Injectable()  
export class PostService {
  constructor(private readonly categoryService: CategoryService // This will be auto injected by Nestjs Injector) {}
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*ley 5

我通过@Inject()从构造函数中删除传递导出服务的参数解决了我的问题。