nestjs 全栈进阶--管道

 视频教程

24_nestjs中的管道_哔哩哔哩_bilibili

1. 介绍

在Nest.js框架中,Pipe 是一种用于处理HTTP请求参数的装饰器和类,它是Nest应用中实现输入验证、数据转换和格式化的重要组件之一。当请求到达控制器(Controller)中的某个路由处理器方法时,可以在方法参数上使用@Body()、@Query()、@Param()等装饰器来指定期望获取的请求体、查询参数或路径参数。然后,通过在这些装饰器之上应用自定义的管道(Pipe),可以对这些参数进行预处理。

nest new pipe -p pnpm

2. 内置pipe

2.1. ParseIntPipe
  • ParseIntPipe: 验证是不是整数,如果不是,就尝试转换,不能转换就抛错

可以看到,我们新建了个handle,我们用@Query装饰器,取了age参数,默认是字符串类型

我们可以通过 ParseIntPipe 把它转为整数

如果我们的age参数不能转换时:

当然,你是可以指定报错信息的,你可以只修改code,也可以修改信息好code

2.2. ParseFloatPipe

是把参数转换为 float 类型的,和ParseIntPipe用法一致,不在赘述

2.3. ParseBoolPipe

是把参数转换为 boolean 类型的,和ParseIntPipe用法一致,不在赘述

2.4. ParseArrayPipe

默认会将接收到的字符串类型的数组参数按照逗号分隔解析为字符串数组,但你也可以指定转换的目标类型,使其自动将字符串转换为目标类型数组。

这时会提示需要 class-validator 包(这是一个对 class 属性做验证的库)

我们安装他

pnpm add class-validator

安装完成后,他会接着报错,缺少 class-transformer 这个包(把普通对象转换为对应的 class 实例的包)

我们继续安装他

pnpm add  class-transformer

然后我们访问下

我们拓展一下,我希望他给我们一个数字的数组,并且前端是以 、分割传递的,这时候就需要用 new ParseArrayPipe 的方式传入参数了

当没有参数时,会报错

如果你希望的是可以不传参数

这样就不会报错,并且没有参数时你得到的值是undefined

2.5. ParseEnumPipe

用于将请求参数转换为枚举类型。这对于确保传入的参数值符合预定义的一组枚举值非常有用。

如果参数值不是枚举里的,就会报错

2.6. ParseUUIDPipe

iuuid 是一种随机生成的几乎不可能重复的字符串

我们可以找个uuid的生成网站得到一个:UUID在线生成器

uuid:eed0ffe6-96f0-414b-aba0-fe2a0d99c1cc

如果不是 uuid 会抛异常

2.7. DefaultValuePipe

它是用来设置参数默认值的

比如这个,传了就是你传的值,没传id时,默认值就是123456

2.8. ValidationPipe 和 ParseFilePipe

这两个内容太多,我们单独讲

2.9. 自定义pipe

我们之前讲aop的时候,已经讲过概念了,我们这里就直接实践,我们来是实现一个DefaultValuePipe

nest g pipe aaa --flat --no-spec
import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';

function isNil(value: any): boolean {
  return value === null || value === undefined;
}

function isNumber(value: any) {
  return typeof value === 'number';
}

@Injectable()
export class AaaPipe implements PipeTransform {
  constructor(protected readonly defaultValue: any) {}

  transform(value: any, metadata: ArgumentMetadata) {
    if (isNil(value) || (isNumber(value) && isNaN(value))) {
      return this.defaultValue;
    }
    return value;
  }
}

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一套目前来说最好的nestjs实战教程,提供QQ长期问答服务. 本人从 08 年到 18 年一直从事于 PHP 的开发。从 18 年开始转向 Typescript+React+Nestjs 的技术栈。目前来说 React 应该是一个非常好用的前端框架,生态非常完善,并且十分灵活简单。Nestjs 则是 Node.js 中唯一且无敌存在的后端 web 框架。因为我个人从事这套技术栈开发已经 4 年多,所以颇有心得,做了这套 React18 视频教程和 Nestjs 实战视频教程。现在视频教程也是刚刚开始做了一部分,还在持续更新。使用 TS 全栈开发可以基本涵盖各种平台的方方面面,比如开发桌面应用的 Electron, 开发小程序的 Taro, 开发 Spa 中后台的 React,开发 SSR 网站的 next.js,开发移动应用的 React Native, 开发 CLI 的 Yargs, 以及开发后端Nestjs。基本学会一套,全面够用,再加上 Monorepo 组织结构,一个仓库所有平台都可以搞定。 包含以下知识点 - 掌握Nestjs框架的依赖注入,模块,提供者,生命周期等概念- 掌握DTO数据验证,响应序列化,异常过滤器等常用功能- 学会编写一些常用的class-validator验证约束- 熟练掌握Typeorm以及Nestjs与Typeorm结合开发- 学会整合Swagger输出Open API文档- 掌握TS装饰器以及反射元数据的定义和使用- 编写一些数据库相关的数据验证约束(比如树形表的同级别某字段唯一验证等)- 学会通过继承并魔改Nestjs源码编写自定义的全局验证器- 可以编写自定义的配置系统以及核心功能包- 学会自定义的代码组织方式(比如教程中我把默认的Nestjs应用改成Util+PluginModule模式)- 掌握编写一些常用的Util仓库(比如数据库,Redis,Restful)- 利用Yargs结合魔改后的框架可以编写一些自定义CLI命令(比如数据迁移,数据填充等)- 掌握如何利用阿里云/腾讯云推送邮件和短信- 掌握使用消息列队(MQ)的方式异步推送邮件和短信- 掌握守卫原理以及编写一些用户验证的守卫- 编写一个完善的用户系统(JWT认证,短信/邮件登录,短信/邮件注册,找回密码,绑定手机和邮箱等)- 熟练地通过编写装饰器去实现一些常用的功能- 通过SSE,WebSockets实现用户的上线,下线以及消息实时推送,消息广播等- 学会使用云存储来上传文件- 学会大文件断点雪川- 实现RBAC的权限系统- 理解请求范围概念以及性能方便的考量- 自己构建配置系统,实现配置验证以及通过YAML或数据库来进行动态配置- 通过适用Vscode进行Debug以及编写Jest测试来提升开发效率与程序的可用性- 学会使用Node来编写自定义的CLI命令- 利用NestCURD进行快速开发- 学会Graphql替代Restful写API- 使用Mongodb替代关系型数据库- 掌握一些常用的打包工具,比如通过ncc打包成单文件,通过pack打包成二进制等- 学会一些常用的部署方式,比如通过nginx+pm2反向代理部署,devops自动化CI,CD等- 学会使用pnpm workspaces来使用monreopo组织代码
nestjs可以使用modbus-tcp进行读写操作。在nestjs中,可以使用npm包“modbus-serial”来实现modbus-tcp的读写操作。首先需要安装该npm包,然后在nestjs中引入该包并使用其提供的方法进行读写操作。具体实现可以参考以下代码: ```typescript import { Injectable } from '@nestjs/common'; import { ModbusTcpClient } from 'modbus-serial'; @Injectable() export class ModbusService { private client: ModbusTcpClient; constructor() { this.client = new ModbusTcpClient({ host: '127.0.0.1', port: 502, }); } async readCoils(address: number, length: number): Promise<boolean[]> { const result = await this.client.readCoils(address, length); return result.data; } async writeCoil(address: number, value: boolean): Promise<void> { await this.client.writeCoil(address, value); } async readHoldingRegisters(address: number, length: number): Promise<number[]> { const result = await this.client.readHoldingRegisters(address, length); return result.data; } async writeHoldingRegister(address: number, value: number): Promise<void> { await this.client.writeHoldingRegister(address, value); } } ``` 在上述代码中,我们创建了一个名为“ModbusService”的nestjs服务,并在构造函数中初始化了一个modbus-serial的客户端。然后,我们定义了四个方法来实现modbus-tcp的读写操作,分别是“readCoils”、“writeCoil”、“readHoldingRegisters”和“writeHoldingRegister”。这些方法分别用于读取线圈、写入线圈、读取保持寄存器和写入保持寄存器。在这些方法中,我们使用了modbus-serial提供的相应方法来实现读写操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值