[NestJs]管道验证、字段验证

管道pipes是什么

管道(pipes)是一种有效的方式来处理输入数据的验证和转换

方式一

需要使用到两个库

npm install class-validator class-transformer -S -D

在项目中新建pipe文件,如login.pipe.ts

import {
  ArgumentMetadata,
  HttpException,
  HttpStatus,
  Injectable,
  PipeTransform,
} from '@nestjs/common';
import { plainToInstance } from 'class-transformer';
import { validate } from 'class-validator';
@Injectable()
export class LoginPipe implements PipeTransform {
  async transform(value: any, metadata: ArgumentMetadata) {
    const DTO = metadata.metatype;
    const instance = plainToInstance(DTO, value);
    const error = await validate(instance);
    if (error.length) {
      throw new HttpException(error, HttpStatus.BAD_REQUEST);
    }
    return value;
  }
}

  1. ArgumentMetadata:用于在管道中访问关于转换过程的元数据。
  2. HttpException:NestJS 中的异常类,用于在管道中抛出 HTTP 异常。
  3. HttpStatus:定义了 HTTP 状态码的枚举。
  4. Injectable:用于标记类作为 NestJS 中的可注入服务。
  5. PipeTransform:定义了管道类需要实现的接口。
  6. plainToInstance:来自 class-transformer 库,用于将普通对象转换为类实例。
  7. validate:来自 class-validator 库,用于验证类实例的数据。

然后定义一个管道类LoginPipe并实现PipeTransform接口
在这里插入图片描述
我们需要在类中实现transform方法,这个方法主要作用只对值进行转换,value为通过结果传入的数据,metadata为我们创建的DTO的元数据
接下来使用plainToInstance实例化并接受返回的实例,使用 class-validator 进行验证,返回验证错误的数组,如果数据长度不为空的话则验证失败,返回的结构如下
在这里插入图片描述
使用throw new HttpException抛出 HTTP 异常,其中包含验证错误信息,这里抛出的异常可以使用之前的文章里写过的错误拦截器去拦截然后返回给用户

dto文件如下
在这里插入图片描述

注册管道验证

在这里插入图片描述
直接在需要验证的接口中传入即可

方式二使用NestJs自带的ValidationPipe验证

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

在这里插入图片描述
第二种方法写起来比较简单,推荐使用第二种方法,验证不通过返回的错误同样可以使用错误拦截器去拦截

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NestJS 中使用 TypeORM 实现用户注册登录验证的步骤如下: 1. 创建 User 实体 首先,你需要创建一个 User 实体,用于表示用户的信息。可以在一个名为 `user.entity.ts` 的文件中定义这个实体,代码如下: ```typescript import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() username: string; @Column() password: string; } ``` 这个实体包含了用户的 id、username 和 password 三个字段。 2. 创建 User 模块 接下来,你需要创建一个 User 模块,用于处理用户的注册、登录等操作。可以在一个名为 `user.module.ts` 的文件中定义这个模块,代码如下: ```typescript import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { UserService } from './user.service'; import { UserController } from './user.controller'; import { User } from './user.entity'; @Module({ imports: [TypeOrmModule.forFeature([User])], providers: [UserService], controllers: [UserController], }) export class UserModule {} ``` 这个模块依赖于 TypeORM 模块,并导入了 UserService 和 UserController。同时,使用 `TypeOrmModule.forFeature` 方法将 User 实体注册到 TypeORM 中。 3. 创建 UserService UserService 用于处理用户相关的业务逻辑。在一个名为 `user.service.ts` 的文件中定义这个服务,代码如下: ```typescript import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { User } from './user.entity'; @Injectable() export class UserService { constructor( @InjectRepository(User) private userRepository: Repository<User>, ) {} async findOne(username: string): Promise<User | undefined> { return this.userRepository.findOne({ username }); } async create(user: User): Promise<void> { await this.userRepository.insert(user); } } ``` 这个服务依赖于 User 实体并使用了 TypeORM 的 Repository 对象来处理数据库操作。其中,`findOne` 方法用于查找指定用户名的用户,`create` 方法用于创建一个新用户。 4. 创建 UserController UserController 用于处理用户相关的 HTTP 请求。在一个名为 `user.controller.ts` 的文件中定义这个控制器,代码如下: ```typescript import { Controller, Post, Body, BadRequestException } from '@nestjs/common'; import { UserService } from './user.service'; import { User } from './user.entity'; @Controller('user') export class UserController { constructor(private readonly userService: UserService) {} @Post('register') async register(@Body() user: User): Promise<void> { const existingUser = await this.userService.findOne(user.username); if (existingUser) { throw new BadRequestException('Username already exists'); } await this.userService.create(user); } @Post('login') async login(@Body() user: User): Promise<void> { const existingUser = await this.userService.findOne(user.username); if (!existingUser || existingUser.password !== user.password) { throw new BadRequestException('Invalid username or password'); } // TODO: return JWT token } } ``` 这个控制器包含了两个路由:注册和登录。在注册路由中,先使用 `findOne` 方法检查指定用户名的用户是否已存在,如果已存在则抛出一个 `BadRequestException` 异常,否则使用 `create` 方法将新用户插入到数据库中。在登录路由中,先使用 `findOne` 方法检查指定用户名的用户是否存在且密码是否匹配,如果不匹配则抛出一个 `BadRequestException` 异常。 5. 配置 TypeORM 最后,你需要在 `app.module.ts` 中配置 TypeORM。代码如下: ```typescript import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { UserModule } from './user/user.module'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: 'password', database: 'test', entities: [__dirname + '/**/*.entity{.ts,.js}'], synchronize: true, }), UserModule, ], }) export class AppModule {} ``` 在这个配置中,使用了 MySQL 数据库,并将 UserModule 导入到 AppModule 中。其中,`entities` 属性是一个数组,指定了所有的实体类文件,TypeORM 在启动时会将这些实体映射到数据库中。`synchronize` 属性为 true 表示在每次启动时自动同步数据库结构。 到这里,用户注册登录验证的功能就实现了。当用户访问 `/user/register` 路由时,会执行 UserController 中的 register 方法,创建一个新用户。当用户访问 `/user/login` 路由时,会执行 UserController 中的 login 方法,检查用户是否存在并验证密码。可以根据需要进一步完善这个功能,例如使用 JWT 来实现用户身份验证

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值