【问题标题】:Nest can't resolve dependencies of the UsersService (UserModel, ?)Nest 无法解析 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数组中

标签: javascript node.js web-applications nestjs


【解决方案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 文件。

      【讨论】:

        猜你喜欢
        • 2020-07-03
        • 2020-08-06
        • 2023-04-01
        • 2022-11-12
        • 2023-01-31
        • 2022-01-17
        • 2018-11-21
        • 2020-03-12
        • 2021-04-28
        相关资源
        最近更新 更多