8

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

4

3 回答 3

17

ErrorService未正确注入UsersModule.

它应该是:

  • providersUsersModule
  • exports一个模块中import,由UsersModule

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

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

  • 1 -添加ErrorServiceproviders. UsersModule但它看起来不是正确的方法,因为我认为/猜测您将在代码的许多其他部分重用此服务(对吗?)。因此,更好:
  • 2 - 创建一个ErrorsModule,然后exports将能够注入服务。 ErrorServiceUsersModuleimport 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是一个更好的名字?如果我的猜测是正确的),使用一个@Globalimport只会在你的主模块中使用一次的模块(AppModule

例子:

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

然后你必须添加LoggerModuleimportsof 中AppModule,并且LoggerService可以在任何地方注入,而无需重新声明它。

于 2018-06-12T20:55:15.137 回答
0

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

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

用户模块.ts

@Module({
    imports: [
        DatabaseModule,
        ErrorService,
    ],
    providers: [
        UsersService,
        ...usersProviders,
        UserResolver,
    ],
})
export class UsersModule {
    constructor(private readonly errorService: ErrorService) {}
}
于 2020-02-03T18:11:23.423 回答
0

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

我有这个:

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

}

而不是这个:

export class UsersModule {
    constructor(private readonly errorService: ErrorService) {}
}
于 2021-02-06T23:00:27.453 回答