【问题标题】:NestJS Cannot resolve dependencies of the UsersModuleNestJS 无法解析 UsersModule 的依赖关系
【发布时间】:2018-11-22 03:42:23
【问题描述】:

NestJS 无法解析 UsersModule 的依赖关系。错误:

错误:Nest 无法解析 UsersModule (?) 的依赖项。请 验证 [0] 参数在当前上下文中是否可用。

app.module.ts:

@Module({
  imports: [
    ConfigModule,
    DatabaseModule,
    GraphQLModule,
    UsersModule,
  ],
  providers: [
    ErrorService,
  ],
  exports: [
    DatabaseModule,
    ErrorService,
  ],
})
export class AppModule implements NestModule {}

users.module.ts:

@Module({
    imports: [
        DatabaseModule,
        ErrorService,
    ],
    providers: [
        UsersService,
        ...usersProviders,
        UserResolver,
    ],
})
export class UsersModule {
    constructor(private readonly errorService: ErrorService) {}
}

问题是这个ErrorService,但是例如数据库模块以类似的方式使用,并且它可以正常工作。我有点困惑)也许有人会帮忙。谢谢。

【问题讨论】:

  • 弗拉德,我在启动 Nestjs 5 时收到了这条消息,并为此提交了一个 Github 问题。 v5 的其他人也是如此。我们可能正在追尾试图解决这个问题。我想我最近才看到另一个帖子,就像几个小时前一样,有同样的信息。
  • 能否分享一个 Github 问题的链接,好吗? @普雷斯顿

标签: typescript nestjs


【解决方案1】:

在我的例子中,Inject 函数的使用是错误的:

我有这个:

export class UsersModule {
    constructor(
         @Inject()
         private readonly errorService: ErrorService
     ) {}

}

而不是这个:

export class UsersModule {
    constructor(private readonly errorService: ErrorService) {}
}

【讨论】:

    【解决方案2】:

    您不需要导入错误服务,因为它已经导入到用户模块中,您的代码应该是这样的: app.module.ts

      imports: [
        ConfigModule,
        DatabaseModule,
        GraphQLModule,
        UsersModule,
      ],
      providers: [
        ErrorService,
      ],
      exports: [
        DatabaseModule,
      ],
    })
    export class AppModule implements NestModule {}
    

    user.module.ts

    @Module({
        imports: [
            DatabaseModule,
            ErrorService,
        ],
        providers: [
            UsersService,
            ...usersProviders,
            UserResolver,
        ],
    })
    export class UsersModule {
        constructor(private readonly errorService: ErrorService) {}
    }
    

    【讨论】:

      【解决方案3】:

      ErrorService 未正确注入 UsersModule

      应该是:

      • providersUsersModule
      • importUsersModule 编辑的一个模块的exports

      否则,Nest 将无法解决它。并且将其添加到 AppModuleexports 也不会使其全球可用。

      我可以看到三个解决方案:

      • 1 - 将ErrorService 添加到UsersModuleproviders。但它看起来不是一个正确的方法,因为我认为/猜测您将在代码的许多其他部分重用此服务(对吗?)。因此,更好:
      • 2 - 创建一个ErrorsModule 其中exports ErrorService,然后UsersModuleimport ErrorsModule 并且将能够注入服务。

      喜欢:

      // errors.module.ts
      @Module({
        providers: [ ErrorService ],
        exports: [ ErrorService ],
      })
      export class ErrorsModule {}
      
      // users.module.ts
      @Module({
        imports: [ErrorsModule],
      })
      export class UsersModule {
        constructor(private readonly errorService: ErrorService) {}
      }
      
      • 3 - 我最喜欢的,如果你的服务应该被重用(LoggerService 是一个更好的名字吗?如果我的猜测是正确的),使用@Global 模块,你将在你的主模块 (AppModule)

      例子:

      @Global()
      @Module({
        providers: [LoggerService],
        exports: [LoggerService],
      })
      export class LoggerModule {
        constructor(private readonly loggerService: LoggerService) { /* initialize logger, or whatever */ }
      }
      

      然后您必须LoggerModule 添加到AppModuleimports,并且LoggerService 将可以在任何地方注射,而无需重新声明它。

      【讨论】:

      • 我正在考虑添加错误模块,但我认为可以通过这种方式注入服务。您的模块解决方案很棒!谢谢。
      猜你喜欢
      • 2019-12-19
      • 2019-12-19
      • 2018-12-25
      • 2020-01-14
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 2020-06-14
      相关资源
      最近更新 更多