【问题标题】:Inject nestjs service from another module从另一个模块注入nestjs服务
【发布时间】:2019-01-20 00:24:38
【问题描述】:

我有一个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 不能 解决 PlayersService (+, ?) 的依赖关系。请确保 索引 [1] 处的参数在当前上下文中可用。

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

【问题讨论】:

    标签: javascript node.js typescript dependency-injection nestjs


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我使用了@KimKern 的建议,仍然看到注入服务无法识别的错误。
    • 试图导入服务本身,结果导入模块本身有效。谢谢
    • @nasta 你还需要在 PlayersService 中额外导入服务吗?即import { ItemsService } from '../items/items.service';。此外,我们在构造函数内部是否使用了某种装饰器? @Inject private readonly itemsService: ItemsService
    • @baku 是的,你需要 js 导入。看到这个答案stackoverflow.com/a/51516526/4694994
    • @Hector 我不确定我是否完全理解您的用例,但我有这两个想法:您可以在 Nests 应用程序容器之外定义常规 JS 类,然后在需要它们的地方创建它们(- > 不能注射)。此外,还有一些全局模块,只需要导入一次(另见stackoverflow.com/a/55181002/4694994)。如果这没有帮助,请考虑打开一个新问题并向其添加更多详细信息,最好是解释您的场景的最小代码 sn-p。
    【解决方案2】:

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

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

    【讨论】:

    • 我认为这个问题只是因为服务没有导出,它与Angular不同。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      通过更改在我的提供程序的@Inject()) 中使用的常量字符串 (TOKEN) 的导入方式解决了我的问题...小心使用 index.ts 和 export * from module.ts,nest 无法解决依赖关系

      【讨论】:

        【解决方案5】:

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

        为此,您需要从 AuthModule 导出 authService

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

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

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

        现在你应该可以在TaskController中使用DI了

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-07-18
            • 2021-05-15
            • 2021-08-30
            • 2020-07-08
            • 2019-12-26
            • 1970-01-01
            • 2021-04-01
            • 2022-11-14
            相关资源
            最近更新 更多