NodeJS 从其他模块注入nestjs服务

gfttwv5a  于 2022-12-18  发布在  Node.js
关注(0)|答案(8)|浏览(148)

我有一个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中,两个服务在各自的模块中单独工作。

ajsxfq5m

ajsxfq5m1#

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

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

然后将导出模块导入到使用该服务的模块中:

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

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

zsohkypk

zsohkypk2#

假设您希望在我的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) {}
   ...
}

swvgeqrz

swvgeqrz3#

这个问题是由Kim克恩回答的。但我只是想提醒通读这篇评论的人,每当你得到这个错误时,你应该按照以下步骤操作,这些步骤可能会帮助你轻松地找出卡住的地方:

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

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

@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使用这个来检测单例类。在Sping Boot - Java中,这个曾经被称为Bean。阅读更多:

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

cidc1ykv

cidc1ykv4#

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

lmyy7pcs

lmyy7pcs5#

我相信你也遇到了同样的问题。我的场景是两个兄弟自定义模块(user,auth)需要使用彼此的服务。我使用 circular DI 来解决它。请检查link
让我知道如果它解决了你的问题,也许我可以进一步建议你。

nle07wnf

nle07wnf6#

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

wwwo4jvm

wwwo4jvm7#

基于Kim克恩的回答,我们现在应该只添加注入式服务到我们的服务中,而不需要任何装饰器(@Inject()不需要)。之后它就会正常工作。这是我的错误,可能会帮助其他人。

rlcwz9us

rlcwz9us8#

步骤1.导出所需的文件步骤2.导入整个模块。
我最初犯了一个错误,将文件添加为提供程序,并添加了引发错误的模块。

相关问题