Nest.js参数校验和自定义返回数据格式详解

下面给你分享关于“Nest.js参数校验和自定义返回数据格式详解”的完整攻略。

一、参数校验

在Nest.js中,我们可以使用class-validator实现参数校验。需要在controller中使用Dto来对每个请求进行参数校验。具体流程如下:

  1. 安装class-validator和class-transformer模块,执行如下命令:
npm install class-validator class-transformer --save
  1. 编写Dto。在Dto中通过 @IsXXX() 来指定验证规则。比如:
import { IsString, IsInt, IsOptional } from 'class-validator';

export class CreateCatDto {
  @IsString()
  readonly name: string;
  @IsInt()
  readonly age: number;
  @IsOptional()
  @IsString()
  readonly breed?: string;
}
  1. 在控制器中使用Dto作为请求参数类型来对参数进行验证。比如:
import { Controller, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Post()
  async create(@Body() createCatDto: CreateCatDto): Promise<Cat> {
    return this.catsService.create(createCatDto);
  }
}
  1. 启用验证器。在Nest.js中,需要在main.ts中设置全局的验证管道。启用该管道后,所有的请求都会经过类验证器进行校验。比如:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();

至此,参数校验功能就实现了。

二、自定义返回数据格式

在Nest.js中,我们可以使用class-transformer和class-validator模块来实现自定义返回数据格式。具体流程如下:

  1. 安装class-transformer和class-validator模块,执行如下命令:
npm install class-transformer class-validator --save
  1. 配置class-transformer。在main.ts中添加如下代码:
import { ValidationPipe } from '@nestjs/common';
import { useContainer } from 'class-validator';
import { ClassSerializerInterceptor } from '@nestjs/common';
import { NestFactory, Reflector } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './http-exception.filter';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  //2. 配置class-transformer
  app.useGlobalInterceptors(new ClassSerializerInterceptor(
      app.get(Reflector)
  ));

  //3. 配置class-validator
  useContainer(app.select(AppModule), {
    fallbackOnErrors: true,
  });

  //1. 配置全局的验证管道
  app.useGlobalPipes(new ValidationPipe({
    whitelist: true,
    transform: true,
    forbidUnknownValues: true,
    transformOptions: {
      excludeExtraneousValues: true,
    },
  }));

  app.useGlobalFilters(new HttpExceptionFilter());
  await app.listen(3000);
}

bootstrap();
  1. 创建一个toJSON()方法并在其中使用class-transformer,将返回的数据转化为我们自己设定的格式。
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
import { Exclude, Transform } from 'class-transformer';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  public id: number;

  @Column()
  public firstName: string;

  @Column()
  public lastName: string;

  @Transform((params) => undefined, { toPlainOnly: true })
  @Exclude()
  @Column()
  public password: string;

  public toJSON(): any {
    const { id, firstName, lastName } = this;
    return { id, firstName, lastName };
  }
}

这里我们以User为例,删掉了password(敏感信息不应该返回给前端)。toJSON() 中自定义了返回的数据格式。

{
"id": 1,
"firstName": "John",
"lastName": "Doe"
}

这样,我们就成功地实现了自定义返回数据格式的功能。

示例:

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  async findAll(): Promise<User[]> {
    return this.usersService.findAll();
  }

  @Get(':id')
  async findOne(@Param('id') id: number): Promise<User> {
    return this.usersService.findOne(id);
  }

  @Post()
  async create(@Body() createUserDto: CreateUserDto): Promise<User> {
    return this.usersService.create(createUserDto);
  }

  @Put(':id')
  async update(@Param('id') id: number, @Body() updateUserDto: UpdateUserDto): Promise<User> {
    return this.usersService.update(id, updateUserDto);
  }

  @Delete(':id')
  async remove(@Param('id') id: number): Promise<void> {
    return this.usersService.remove(id);
  }
}

以上就是“Nest.js参数校验和自定义返回数据格式详解”的完整攻略啦。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nest.js参数校验和自定义返回数据格式详解 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Nodejs下使用gm圆形裁剪并合成图片的示例

    下面是详细讲解Nodejs下使用gm圆形裁剪并合成图片的完整攻略。 1. 确认GM库是否安装 在使用GM库之前,需要确认该库已被正确安装。可以使用以下命令进行确认: gm version 如果GM库已被正确安装,则会输出以下信息: GraphicsMagick 1.3.36 2018-04-22 Q16 http://www.GraphicsMagick.o…

    node js 2023年6月8日
    00
  • JS异步错误捕获的一些事小结

    JS异步错误捕获的一些事小结 背景 随着前端项目逐渐变大、代码逐渐复杂,异步错误的捕获成为前端开发中的难点之一。本文将结合实际应用场景,介绍JS异步错误捕获的一些事情。 具体内容 Promise Promise的错误捕获是一个重要的部分,一般来说我们需要用到 then() 中的第二个参数来进行错误捕获。示例代码如下: fetch(‘http://exampl…

    node js 2023年6月8日
    00
  • Node.js之删除文件夹(含递归删除)代码实例

    Node.js之删除文件夹(含递归删除)代码实例 前言 在Node.js中,删除文件夹的操作并不难,但是删除带有子文件夹和子文件的文件夹,就需要使用递归方式删除。本文将会提供两个示例说明在Node.js中如何实现带有子文件夹和子文件的文件夹的删除。 操作步骤 步骤一:安装依赖 在Node.js中,使用fs(file system)模块进行文件和文件夹的操作。…

    node js 2023年6月8日
    00
  • Node.js前后端交互实现用户登陆的实践

    我会提供一个Node.js实现前后端交互实现用户登录的攻略,包含以下部分内容: 前置知识 搭建后端Node.js服务器 实现前端页面 实现用户注册和登录功能 示例演示 1. 前置知识 在学习Node.js实现前后端交互,需要掌握以下基本知识: HTML、CSS、JavaScript基础知识 Ajax异步请求和响应 Node.js后台知识 2. 搭建后端Nod…

    node js 2023年6月8日
    00
  • Nodejs学习笔记之Global Objects全局对象

    下面详细讲解一下“Nodejs学习笔记之Global Objects全局对象”的攻略。 1. 什么是Global Objects? 在Node.js的全局作用域中,存在一些对象,这些对象可以在任何地方访问,被称作全局对象,其中包括: global对象:它是一个全局对象,可以在任何地方访问,如果一个变量在所有模块中都是全局变量,它就是global对象的属性之一…

    node js 2023年6月8日
    00
  • JavaScript命令模式原理与用法实例详解

    JavaScript命令模式原理与用法实例详解 JavaScript命令模式(Command Pattern)是一种基于面向对象编程中的行为型模式。该模式将请求封装成一个对象,以便于对请求的参数化、延迟执行(如将一个请求排队或者记录请求日志)以及支持可撤销操作等功能。 命令模式原理 命令模式的核心是通过一个命令对象包装所有的请求细节,以达到解耦调用者与接收者…

    node js 2023年6月8日
    00
  • 基于JavaScript编写一个图片转PDF转换器

    下面是基于JavaScript编写一个图片转PDF转换器的完整攻略。 步骤一:安装依赖 首先需要安装两个JavaScript库:pdf-lib和fs。 pdf-lib是用于创建和操作PDF文档的JavaScript库。 fs是用于读取和写入文件的JavaScript库。 可以使用npm在命令行中进行安装: npm install pdf-lib fs 步骤二…

    node js 2023年6月8日
    00
  • typescript在node.js下使用别名(paths)无效的问题详解

    我来给您讲解一下。 问题现象 在使用Typescript编写Node.js应用程序时,我们有时会使用到Webpack或者tsconfig.json的paths字段设置路径别名,但是在实际使用中会出现别名无法生效的问题。这是因为Node.js默认不支持paths别名设置。 解决方案 解决这个问题的方法有两种: 方案一:使用Babel插件 我们可以使用Babel…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部