NestJS 无法解析 UsersModule 的依赖关系

NestJS Cannot resolve dependencies of the UsersModule

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

Error: Nest can't resolve dependencies of the UsersModule (?). Please verify whether [0] argument is available in the current context.

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,但是例如数据库模块以类似的方式使用,并且它没有任何错误地工作。我有点困惑)也许有人会帮忙。谢谢。

ErrorService 未正确注入 UsersModule.

它应该是:

  • UsersModuleproviders
  • 在一个模块的 exportsimport 编辑者 UsersModule

否则Nest无法解析。将它添加到 AppModuleexports 中也不会使它全局可用。

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

  • 1 - 将 ErrorService 添加到 UsersModuleproviders。但这看起来不是正确的方式,因为我 think/guess 您将在代码的许多其他部分重用此服务(对吗?)。因此,更好:
  • 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 模块,您将 import 在你的主模块中只有一次 (AppModule)

示例:

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

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

您不需要导入错误服务,因为它已经导入到用户模块中您的代码应该是这样的: 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) {}
}

在我的例子中,注入函数的使用有误:

我有这个:

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

}

而不是这个:

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