Nest 无法解析 AuthService 的依赖关系

问题描述 投票:0回答:1

NestJS 中的错误:“Nest 无法解析 AuthService(?、JwtService)的依赖项。”

我是 NestJS 的新手,我正在尝试使用 JWT 令牌通过 NestJS 实现身份验证。但是,当我运行代码时,遇到以下错误:

[Nest] 42680  - 04/04/2024, 1:44:57 PM   ERROR [ExceptionHandler] Nest can't resolve dependencies of the AuthService (?, JwtService). Please make sure that the argument "UserRepository" at index [0] is available in the AuthModule context.

这就是我的代码的样子,任何人都可以帮我解决这个问题。

app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { AuthModule } from './auth/auth.module';
import { TodosModule } from './todos/todos.module';
import { UsersModule } from './users/users.module';
import { DatabaseModule } from './database/database.module';

@Module({
  imports: [AuthModule, TodosModule, UsersModule, DatabaseModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

users.module.ts

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]
})
export class UsersModule {}

users.controller.ts

import { Controller} from '@nestjs/common';

@Controller('users')
export class UsersController {}

users.service.ts

import { Injectable } from '@nestjs/common';

@Injectable()
export class UsersService {}

用户.repository.ts

import {
  ConflictException,
  Injectable,
  NotFoundException,
} from '@nestjs/common';
import { CreateUserDto } from '../dto/create-user.dto';
import { UpdateUserDto } from '../dto/update-user.dto';
import { User } from '../entities/user.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { DeepPartial, Equal, Repository } from 'typeorm';
import * as bcrypt from 'bcrypt';

@Injectable()
export class UserRepository {
  constructor(
    @InjectRepository(User) private readonly userRepository: Repository<User>,
  ) {}

  async createUser(createUserDto: CreateUserDto): Promise<User> {
    const user = this.userRepository.create({
      ...createUserDto,
    });
    
    return await this.userRepository.save(user);
  }

  async findByUsername(username: string): Promise<User | null> {
    const existingUser = await this.userRepository.findOne({
      where: { username: username },
    });
    if (existingUser) {
      return existingUser;
    } else {
      return null;
    }
  }

  async _hashPassword(password: string): Promise<string> {
    return bcrypt.hash(password, 10);
  }

  async findAllUsers(): Promise<User[]> {
    return await this.userRepository.find();
  }

  async findById(id: number): Promise<User> {
    const user = await this.userRepository.findOne({
      where: { id: Equal(id) },
    });
    if (!user) {
      throw new NotFoundException(`User with ID ${id} not found.`);
    }
    return user;
  }

  async updateById(id: number, updateUserDto: UpdateUserDto): Promise<User> {
    const user = await this.userRepository.findOne({
      where: { id: Equal(id) },
    });
    this.userRepository.merge(user, updateUserDto);
    return await this.userRepository.save(user);
  }

  async removeById(id: number): Promise<void> {
    const user = await this.userRepository.findOne({
      where: { id: Equal(id) },
    });
    await this.userRepository.remove(user);
  }
}

auth.module.ts

import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { JwtModule, JwtService } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { JwtStrategy } from './utils/jwt.strategy';
import { UserRepository } from '../users/repository/user.repository';
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 {}

auth.controller.ts

import {
  Body,
  Controller,
  Get,
  HttpException,
  Post,
  Req,
  UseGuards,
} from '@nestjs/common';
import { AuthService } from './auth.service';
import { Request } from 'express';
import { CreateUserDto } from '../users/dto/create-user.dto';

export interface UserAuthResponse {
  success: boolean;
  message: string;
}

@Controller('auth')
export class AuthController {
  constructor(private authService: AuthService) {}

  @Post('/signup')
  async signup(@Body() createUserDto: CreateUserDto): Promise<UserAuthResponse> {
    const newUser = await this.authService.signUp(createUserDto);

    console.log(newUser);

    return {
      success: true,
      message: 'Successfully signed up!',
    };
  }
}

auth.service.ts

import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import * as bcrypt from 'bcrypt';
import { User } from '../users/entities/user.entity';
import { UserRepository } from '../users/repository/user.repository';
import { CreateUserDto } from '../users/dto/create-user.dto';

@Injectable()
export class AuthService {
  constructor(
    @InjectRepository(User)
    private readonly userRepository: UserRepository,
    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;
  }
}
authentication jwt nestjs passport-local passport-jwt
1个回答
0
投票

您需要在 user.module 的导出中添加 UserRepository 并删除 auth.module 提供程序中未使用的 UserRepository 。

© www.soinside.com 2019 - 2024. All rights reserved.