You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS无法解析AuthService的UsersService依赖问题求助

NestJS依赖解析错误排查:无法注入UsersService

[Nest] 1276 - 25/04/2024 19:39:31 ERROR [ExceptionHandler] Nest can't resolve dependencies of the AuthService (?, JwtService). Please make sure that the argument UsersService at index [0] is available in the AuthModule context.

我尝试了官方提示的潜在解决方案:

  • AuthModule是否为有效的NestJS模块?
  • 若UsersService是提供者,它是否属于当前AuthModule?
  • 若UsersService从独立@Module导出,该模块是否已在AuthModule中导入?

但相同代码在另一个项目能正常运行,实在搞不懂问题出在哪,以下是我的相关代码:

AuthModule

import { Module } from '@nestjs/common';
import { AuthController } from './auth.controller';
import { AuthService } from './auth.service';
import { UsersModule } from 'src/modules/users/users.module';
import { JwtModule } from '@nestjs/jwt';
import { jwtConstants } from './constants';
import { LocalStrategy } from './local.strategy';
import { JwtStrategy } from './jwt.strategy';

@Module({
  imports: [
    UsersModule,
    JwtModule.register({
      secret: jwtConstants.secret,
      signOptions: { expiresIn: '24h' },
    }),
  ],
  controllers: [AuthController, LocalStrategy, JwtStrategy],
  providers: [AuthService],
})
export class AuthModule {}

AppModule

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import config from 'config';
import { UsersModule } from './modules/users/users.module';
import { ConfigModule } from '@nestjs/config';
import { AuthModule } from './auth/auth.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true, // no need to import into other modules
    }),
    MongooseModule.forRoot(config.get('mongoDbUrl'), {
      w: 1,
    }),
    UsersModule,
    AuthModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

UsersModule

import { Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { MongooseModule } from '@nestjs/mongoose';
import { User, UserSchema } from '../../shared/schema/user';

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

AuthService

import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import * as bcrypt from 'bcrypt';
import { UsersService } from 'src/modules/users/Users.service';
import { User } from 'src/shared/schema/user';

@Injectable()
export class AuthService {
  constructor(
    private usersService: UsersService,
    private jwtService: JwtService,
  ) {}

  async validateUser(username: string, pass: string): Promise<any> {
    const user = await this.usersService.findOneByUsername(username);
    if (user && user.password === pass) {
      // eslint-disable-next-line @typescript-eslint/no-unused-vars
      const { password, ...result } = user;
      return result;
    }
    return null;
  }

  async signin(user: User): Promise<any> {
    const foundUser = await this.usersService.userGet(user.email);
    if (foundUser) {
      const { password } = foundUser;
      if (bcrypt.compare(user.password, password)) {
        const payload = { email: user.email };
        return {
          accessToken: this.jwtService.sign(payload),
        };
      }
      return new HttpException(
        'email ou mot de passe incorrect',
        HttpStatus.UNAUTHORIZED,
      );
    }
    return new HttpException(
      'email ou mot de passe incorrect',
      HttpStatus.UNAUTHORIZED,
    );
  }

  async login(user: any) {
    const payload = { username: user.username, userId: user.id };
    return {
      access_token: this.jwtService.sign(payload),
    };
  }
}

问题根源及修复方案

  1. 大小写敏感的导入错误
    AuthService中导入UsersService的路径写为src/modules/users/Users.service,但NestJS约定文件名小写开头(通常是users.service)。Linux/macOS系统区分文件名大小写,会导致依赖无法定位。修改导入路径:

    import { UsersService } from 'src/modules/users/users.service';
    
  2. 策略类放置位置错误
    LocalStrategy和JwtStrategy属于守卫/策略类,应放在providers数组中,而非controllers数组。调整AuthModule配置:

    @Module({
      imports: [
        UsersModule,
        JwtModule.register({
          secret: jwtConstants.secret,
          signOptions: { expiresIn: '24h' },
        }),
      ],
      controllers: [AuthController],
      providers: [AuthService, LocalStrategy, JwtStrategy],
    })
    export class AuthModule {}
    
  3. 异步方法未加await
    bcrypt.compare是异步方法,必须加await才能获取正确的布尔值,否则会直接返回Promise对象导致逻辑错误:

    if (await bcrypt.compare(user.password, password)) {
      // 后续逻辑
    }
    

内容的提问来源于stack exchange,提问作者Ganzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:03:29