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

1 javascript web-applications node.js nestjs

我的用户.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 {}
Run Code Online (Sandbox Code Playgroud)

我的 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 {}
Run Code Online (Sandbox Code Playgroud)

我的应用程序模块.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 {}
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

[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 pm 错误 [ExceptionHandler] Nest 无法解析 UsersService(UserModel,?)的依赖项。请确保索引 [1] 处的参数 AuthService 在 UsersModule 上下文中可用。

潜在的解决方案:

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

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

潜在的解决方案:

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

  • 如果 AuthService 是从单独的 @Module 导出的,那么该模块是否会在 UsersModule 中导入?@Module({ import: [ /* 包含 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) 在 InstanceLoader.createInstancesOfProviders 处的异步 Promise.all (索引 3)(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

Jay*_*iel 5

我将对您的服务构造函数做出一些假设,因为您尚未提供这些假设:

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

@Module({
  imports: [forwardRef(() => UserModule), ...rest],
  providers,
  controllers,
  exports
})
export class AuthModule {}
Run Code Online (Sandbox Code Playgroud)
@Module({
  imports: [forwardRef(() => AuthModule), ...rest],
  providers,
  controllers,
  exports
})
export class UserModule {}
Run Code Online (Sandbox Code Playgroud)

说到exports上面,如果您计划在其所在​​的模块之外使用它,则需要导出提供程序(例如,要在 的内部providers使用,需要有。这使得该提供程序可以在其他地方使用。AuthServiceUserServiceAuthModuleproviders: [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
}
Run Code Online (Sandbox Code Playgroud)

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