NestJS企业级登录注册如何做

NestJS企业级登录注册如何做

这里我们后续依赖使用到的几个依赖模块如下(可以提前下载好)

javascript 复制代码
npm install bcrypt // 加密密码
npm install class-validator  //装饰器来验证数据的有效性

注册模块

register.dto.ts注册规则

新建一个register.dto.ts存放我们注册部分规则

javascript 复制代码
// src/modules/user/dto/register.dto.ts
import { IsString, IsEmail, MinLength } from 'class-validator';

export class RegisterDto {
  @IsString()
  username: string;
  @IsString()
  @MinLength(3)
  password: string;
}

user.service.ts

javascript 复制代码
import { Injectable ,ConflictException} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
import { RegisterDto } from './dto/register.dto';
@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
  ) {}
  // 获取所有用户
  async findAll(): Promise<User[]> {
    return this.userRepository.find();
  }
  async register(registerDto: RegisterDto): Promise<User> {
    // 检查用户是否已经存在
    const existingUser = await this.userRepository.findOne({ where: { username: registerDto.username } });
    if (existingUser) {
      throw new ConflictException('Username already exists');
    }
    // 创建新用户
    const user = new User();
    user.username = registerDto.username;
    user.password = registerDto.password;

    // 保存到数据库
    return this.userRepository.save(user);
  }
}

user.controller.ts

更改一下我们使用的注册接口

javascript 复制代码
import { Controller, Get, Post, Param, Body, Put, Delete } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.entity';
import { RegisterDto } from './dto/register.dto';
@Controller()
export class UserController {
  constructor(private readonly userService: UserService) {}
  @Get('users')
  async findAll(): Promise<User[]> {
    return this.userService.findAll();
  }
  @Post('register')
  async register(@Body() registerDto: RegisterDto): Promise<User> {
    return this.userService.register(registerDto);
  }
}

检测注册模块

接下来我们测试一下我们的数据模块,用户存在的时候,这里给我们的提示

javascript 复制代码
{
    "message": "Username already exists",
    "error": "Conflict",
    "statusCode": 409
}
👉手动设置请求的返回格式

后续优化看代码,这里只是简单返回一下

javascript 复制代码
 return {
  data: [],
  message: '用户已存在!',
  code: 400,
};
👉再次注册
javascript 复制代码
//存在用户
{
    "code": 400,
    "message": "用户已存在!"
}



//新用户注册
{
    "message": "恭喜你,您的账号注册成功!",
    "code": 200
}

登录模块编写

这里我们直接也是将登录编写进了用户部分,先以实现功能为主

👉用户dto部分

先编写一个用户对应的规则dto部分

javascript 复制代码
// src/modules/user/dto/login.dto.ts
import { IsString, IsEmail, MinLength } from 'class-validator';
export class LoginDto{
  @IsString()
  username: string;
  @IsString()
  @MinLength(3)
  password: string;
}
👉user.service.ts之中添加登录方法
javascript 复制代码
import { LoginDto } from './dto/login.dto';

// 异步登录
  async login(loginDto: LoginDto){
  // 查询数据库中是否存在同名用户

  // 1. 查询数据库中是否存在该用户
  const loginUser = await this.userRepository.findOne({
    where: { username: loginDto.username },
  });

   // 2. 如果用户不存在,返回异常信息
   if (!loginUser) {
    throw new HttpException(
      {
        code: 404, // 适当的错误码是 404 (用户未找到)
        message: '用户不存在!',
      },
      HttpStatus.NOT_FOUND, // 使用 404 状态码
    );
  }
  // 3. 比较密码是否正确
  if (loginDto.password  !==  loginUser.password) {
    throw new HttpException(
      {
        code: 401, // 未授权错误码
        message: '密码错误!',
      },
      HttpStatus.UNAUTHORIZED, // 使用 401 状态码
    );
  }

  // 4. 返回登录成功信息,可以添加 JWT 或 Session 等信息
  return {
    message: '登录成功!',
    code: 200,
    data: {
      username: loginUser.username,
      userId: loginUser.userId,
      // 可以附带其他的用户信息,如权限、token等
    },
  };
}
👉user.controller.ts之中使用

上面的方法服务写完了,但是我们还没有在控制器之中使用,这个时候需要使用一下

可以先导入我们的dto规则部分

javascript 复制代码
import { LoginDto } from './dto/login.dto';

post接口调佣

javascript 复制代码
 @Post('login')
// 登录方法
 login(@Body() loginDto: LoginDto){
  // 调用userService中的login方法
  return this.userService.login(loginDto);
}

核查登录模块

👉核查登录

接下来我们尝试调一下我们的登录接口

javascript 复制代码
http://localhost:8888/api/login
👉登录正确时候
javascript 复制代码
{
    "message": "登录成功!",
    "code": 200,
    "data": {
        "username": "admin",
        "userId": 6
    }
}
👉登录错误时候
javascript 复制代码
{
    "code": 404,
    "message": "用户不存在!"
}

这个时候我们的登录和注册模块功能已经好了

相关推荐
WooaiJava7 分钟前
AI 智能助手项目面试技术要点总结(前端部分)
javascript·大模型·html5
爱喝白开水a26 分钟前
前端AI自动化测试:brower-use调研让大模型帮你做网页交互与测试
前端·人工智能·大模型·prompt·交互·agent·rag
Never_Satisfied26 分钟前
在JavaScript / HTML中,关于querySelectorAll方法
开发语言·javascript·html
董世昌4126 分钟前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
80530单词突击赢35 分钟前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
爬山算法1 小时前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
WeiXiao_Hyy1 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
苏渡苇1 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
吃杠碰小鸡1 小时前
高中数学-数列-导数证明
前端·数学·算法
long3161 小时前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法