NestJS依赖注入错误:AuthService无法解析UserRepository依赖
问题解决:Nest无法解析AuthService的UserRepository依赖
问题根源
- UsersModule未导出UserRepository:当前UsersModule仅导出了
UsersService,导致AuthModule导入UsersModule后无法获取UserRepository实例。 - AuthService注入方式错误:自定义的
UserRepository不是TypeORM原生Repository,不能用@InjectRepository(User)装饰器注入。 - AuthModule重复注册UserRepository:在AuthModule的providers中重复声明
UserRepository,会创建新实例,而该实例无法获取TypeORM的UserRepository依赖(因为TypeOrmModule.forFeature([User])仅在UsersModule中配置)。
修复步骤
1. 修改UsersModule,导出UserRepository
在users.module.ts中,将UserRepository加入exports数组:
import { Module } from '@nestjs/common'; import { UsersService } from './users.service'; import { UsersController } from './users.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; import { User } from './entities/user.entity'; import { UserRepository } from './repository/user.repository'; @Module({ imports: [TypeOrmModule.forFeature([User])], controllers: [UsersController], providers: [UsersService, UserRepository], exports: [UsersService, UserRepository] // 新增UserRepository导出 }) export class UsersModule {}
2. 修正AuthService的注入方式
在auth.service.ts中,移除@InjectRepository(User)装饰器,直接注入自定义的UserRepository:
import { Injectable } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { UserRepository } from '../users/repository/user.repository'; import { CreateUserDto } from '../users/dto/create-user.dto'; @Injectable() export class AuthService { constructor( private readonly userRepository: UserRepository, // 移除@InjectRepository装饰器 private jwtService: JwtService, ) {} async signUp(createUserDto: CreateUserDto): Promise<any> { const { username, password } = createUserDto; const existingUser = await this.userRepository.findByUsername(username); if (existingUser) { return existingUser; } const hashedPassword = await this.userRepository._hashPassword(password); const newUser = await this.userRepository.createUser({ username, password: hashedPassword }); return newUser; } }
3. 移除AuthModule中重复的UserRepository注册
在auth.module.ts的providers中删除UserRepository,通过导入UsersModule获取实例:
import { Module } from '@nestjs/common'; import { AuthService } from './auth.service'; import { AuthController } from './auth.controller'; import { JwtModule } from '@nestjs/jwt'; import { PassportModule } from '@nestjs/passport'; import { JwtStrategy } from './utils/jwt.strategy'; import { UsersModule } from '../users/users.module'; @Module({ imports: [ PassportModule, JwtModule.register({ secret: 'abc123', signOptions: { expiresIn: '15m' } }), UsersModule, ], providers: [AuthService, JwtStrategy], // 删除UserRepository controllers: [AuthController], }) export class AuthModule {}
验证
修改完成后重启应用,依赖注入错误会被解决,AuthService将能正常获取UserRepository实例。
内容的提问来源于stack exchange,提问作者Muditha Madusith
相关产品推荐
相关产品推荐

