从另一个模块注入 nestjs 服务

Inject nestjs service from another module

我有一个 PlayersModule 和一个 ItemsModule

我想在PlayersService中使用ItemsService

当我注入时:

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){}

我收到这个嵌套错误:

[Nest] 11592 - 2018-8-13 11:42:17 [ExceptionHandler] Nest can't resolve dependencies of the PlayersService (+, ?). Please make sure that the argument at index [1] is available in the current context.

两个模块都在 app.module.ts 中导入。这两项服务都在各自的模块中单独工作。

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

@Module({
  controllers: [ItemsController],
  providers: [ItemsService],
  exports: [ItemsService]
  ^^^^^^^^^^^^^^^^^^^^^^^
})
export class ItemsModule {}

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

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

⚠️不要将同一个提供者添加到多个模块。导出提供者,导入模块。 ⚠️

我相信你遇到了和我一样的问题。我的场景是需要使用彼此服务的 2 个同级自定义模块(用户、身份验证)。我用循环DI解决了。请检查此 link

如果它解决了您的问题,请告诉我,也许我可以为您提供进一步的建议。

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

通过更改我的提供商的@Inject()) 中使用的常量字符串 (TOKEN) 的导入方式解决了我的问题...小心使用 index.ts whith export * from module.ts , nest 不会解析 dependecy

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

为此,您需要从 AuthModule

导出 authService
@Module({
    imports: [
     ....
    ],
    providers: [AuthService],
    controllers: [AuthController],
    exports:[AuthService]
  })
export class AuthModule {}
  

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

@Module({
    imports:[
      AuthModule
    ],
    controllers: [TasksController],
    providers: [TasksService]
  })
export class TasksModule {}

现在您应该可以在 TaskController 中使用 DI

@Controller('tasks')
export class TasksController {
   constructor(private authService: AuthService) {}
   ...
}
  

根据 Kim Kern 现在的回答,我们应该只将注入服务添加到我们的服务中,而不需要任何装饰器(@Inject() 不需要)。之后它将正常工作。那是我的错误,可能可以帮助其他人。

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

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

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

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

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

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

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