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), }; } }
问题根源及修复方案
大小写敏感的导入错误
AuthService中导入UsersService的路径写为src/modules/users/Users.service,但NestJS约定文件名小写开头(通常是users.service)。Linux/macOS系统区分文件名大小写,会导致依赖无法定位。修改导入路径:import { UsersService } from 'src/modules/users/users.service';策略类放置位置错误
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 {}异步方法未加await
bcrypt.compare是异步方法,必须加await才能获取正确的布尔值,否则会直接返回Promise对象导致逻辑错误:if (await bcrypt.compare(user.password, password)) { // 后续逻辑 }
内容的提问来源于stack exchange,提问作者Ganzo
相关产品推荐
相关产品推荐

