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】:
我将对你的服务构造函数做一些假设,因为你没有提供这些:
UserModule
和 AuthModule
之间的引用看起来像是循环引用。因此,在每个模块的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 无法解析 RabbitMQService 服务的依赖关系