Nest 无法解析 UsersService (UserModel, ?) 的依赖关系

Posted

技术标签:

【中文标题】Nest 无法解析 UsersService (UserModel, ?) 的依赖关系【英文标题】:Nest can't resolve dependencies of the UsersService (UserModel, ?) 【发布时间】:2021-11-13 22:23:33 【问题描述】:

我的 user.module.ts:

import  forwardRef, Module  from '@nestjs/common';
import  UsersService  from './users.service';
import  UsersController  from './users.controller';
import  UserSchema  from './schemas/user.schema';
import  MongooseModule  from '@nestjs/mongoose';
import  AuthModule  from 'src/auth/auth.module';


@Module(
  imports: [MongooseModule.forFeature([name: 'User', schema: UserSchema]),AuthModule],
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService]
)
export class UsersModule 

我的 auth.module.ts

import  forwardRef, Module  from '@nestjs/common';
import  AuthService  from './auth.service';
import  UsersModule  from '../users/users.module';
import  PassportModule  from '@nestjs/passport';
import  LocalStrategy  from './local.strategy';

@Module(
  imports: [forwardRef(() => UsersModule), PassportModule],
  providers: [AuthService, LocalStrategy],
)
export class AuthModule 

我的 app.module.ts

import  Module  from '@nestjs/common';
import  MongooseModule  from '@nestjs/mongoose';
import  AppController  from './app.controller';
import  AppService  from './app.service';
import  UsersModule  from './users/users.module';


@Module(
  imports: [UsersModule,MongooseModule.forRoot('mongodb://localhost:27017/nest1')],
  controllers: [AppController],
  providers: [AppService],
)
export class AppModule 

这给了我错误:

[12:55:42 pm] 发现 0 个错误。监视文件更改。

[Nest] 15944 - 20/09/2021, 12:55:45 pm LOG [NestFactory] ​​开始 Nest 应用程序... [Nest] 15944 - 20/09/2021, 12:55:45 pm LOG [InstanceLoader] MongooseModule 依赖初始化 +126ms [Nest] 15944 - 20/09/2021,下午 12:55:46 错误 [ExceptionHandler] Nest 不能 解决 UsersService (UserModel, ?) 的依赖关系。请做出来 确保索引 [1] 处的参数 AuthService 在 UsersModule 上下文。

可能的解决方案:

如果 AuthService 是提供者,它是当前 UsersModule 的一部分吗? 如果 AuthService 是从单独的 @Module 导出的,那么该模块是否会导入到 UsersModule 中? @模块( 导入:[ /* 包含 AuthService 的模块 */ ] )

错误:Nest 无法解析 UsersService (UserModel, ?)。请确保索引 [1] 处的参数 AuthService 是 在 UsersModule 上下文中可用。

可能的解决方案:

如果 AuthService 是提供者,它是当前 UsersModule 的一部分吗?

如果 AuthService 是从单独的 @Module 导出的,那么该模块是否会导入到 UsersModule 中? @模块( 导入:[ /* 包含 AuthService 的模块 */ ] )

在 Injector.lookupComponentInParentModules (C:\Users\Asus\Desktop\BILDEMP\ems-by-nestjs\employee-management-system\node_modules@nestjs\core\injector\injector.js:193:19) 在 Injector.resolveComponentInstance (C:\Users\Asus\Desktop\BILDEMP\ems-by-nestjs\employee-management-system\node_modules@nestjs\core\injector\injector.js:149:33) 在 resolveParam (C:\Users\Asus\Desktop\BILDEMP\ems-by-nestjs\employee-management-system\node_modules@nestjs\core\injector\injector.js:103:38) 在 async Promise.all (索引 1) 在 Injector.resolveConstructorParams (C:\Users\Asus\Desktop\BILDEMP\ems-by-nestjs\employee-management-system\node_modules@nestjs\core\injector\injector.js:118:27) 在 Injector.loadInstance (C:\Users\Asus\Desktop\BILDEMP\ems-by-nestjs\employee-management-system\node_modules@nestjs\core\injector\injector.js:47:9) 在 Injector.loadProvider (C:\Users\Asus\Desktop\BILDEMP\ems-by-nestjs\employee-management-system\node_modules@nestjs\core\injector\injector.js:69:9) 在 async Promise.all (索引 3) 在 InstanceLoader.createInstancesOfProviders (C:\Users\Asus\Desktop\BILDEMP\ems-by-nestjs\employee-management-system\node_modules@nestjs\core\injector\instance-loader.js:44:9) 在 C:\Users\Asus\Desktop\BILDEMP\ems-by-nestjs\employee-management-system\node_modules@nestjs\core\injector\instance-loader.js:29:13

【问题讨论】:

我的意思是,我没有使用nest.js 的经验,但错误特别指出,“请确保索引[1] 处的参数AuthService 在UsersModule 上下文中可用”所以输入AuthService在你的 user.module.ts 中的某个地方。可能在UsersService之后的providers数组中 【参考方案1】:

我将对你的服务构造函数做一些假设,因为你没有提供这些:

UserModuleAuthModule 之间的引用看起来像是循环引用。因此,在每个模块的imports 中,您需要使用要导入的模块的forwardRef

@Module(
  imports: [forwardRef(() => UserModule), ...rest],
  providers,
  controllers,
  exports
)
export class AuthModule 
@Module(
  imports: [forwardRef(() => AuthModule), ...rest],
  providers,
  controllers,
  exports
)
export class UserModule 

说到上面的exports,如果你打算在模块外部使用它,那么你需要导出一个提供程序,它位于providers 中(例如,在UserService 内部使用AuthService,@ 987654331@ 需要有 providers: [AuthService] exports: [AuthService]。这使得提供程序可以在其他地方使用。

现在,要使用服务内部的循环依赖,您还需要使用forwardRef。在这种情况下,它看起来像 @Inject(forwardRef(() => OtherClass)) private readonly other: OtherClass,所以你会有类似的东西

@Injectable()
export class UserService 
  constructor(
    @Inject(forwardRef(() => AuthService)) private readonly auth: AuthService,
    private readonly dep2: DependencyClass2
  ) 

  // rest of values

您将在 AuthService 中执行相同的操作,但将 @Inject() 中的 AuthService 替换为 UserService

【讨论】:

【参考方案2】:

您必须在 authmodule 中导出 auth 服务才能将其注入到用户服务中。

【讨论】:

【参考方案3】:

需要在 UserModule 中导入 UserService 的所有依赖。如果您仍然无法弄清楚,请在问题中添加您的 user.service.ts 文件。

【讨论】:

以上是关于Nest 无法解析 UsersService (UserModel, ?) 的依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

Nest 无法解析 PhotoService 的依赖关系(?)

Nest 无法解析 UserModel 的依赖项(?)

Nest 无法解析存储库的依赖关系

Nest 无法解析 RabbitMQService 服务的依赖关系

Nest 无法解析 JwtService (?) [JWT_MODULE_OPTIONS] 的依赖项

Nest 在测试期间无法解析 UserService 的依赖关系