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;
}
}
您需要在 user.module 的导出中添加 UserRepository 并删除 auth.module 提供程序中未使用的 UserRepository 。