第十五章 Nest Pipe(內置及自定義)

NestJS的Pipe是一個用于數據轉換和驗證的特殊裝飾器。Pipe可以應用于控制器(Controller)的處理方法(Handler)和中間件(Middleware),用于處理傳入的數據。它可以用來轉換和驗證數據,確保數據的有效性和一致性。

內置的 Pipe 是指在使用 NestJS 框架時,已經預定義好的一些管道,用于驗證和轉換傳入的數據。

  • ValidationPipe(驗證管道):用于驗證傳入的數據是否符合指定的規則,可以使用 class-validator 和 class-transformer 庫來實現驗證和轉換。
  • ParseIntPipe(整數轉換管道):用于將傳入的字符串轉換為整數。
  • ParseBoolPipe(布爾值轉換管道):用于將傳入的字符串轉換為布爾值。
  • ParseArrayPipe(數組轉換管道):用于將傳入的字符串轉換為數組。
  • ParseUUIDPipe(UUID 轉換管道):用于將傳入的字符串轉換為 UUID。
  • DefaultValuePipe(默認值管道):用于在傳入的參數不存在時,給參數設置一個默認值。
  • ParseEnumPipe(枚舉轉換管道):用于將傳入的字符串轉換為枚舉類型。
  • ParseFloatPipe(浮點數轉換管道):用于將傳入的字符串轉換為浮點數。
  • ParseFilePipe(文件轉換管道):用于將傳入的文件轉換為上傳的文件對象。

接下來我們測試一下內置 Pipe 的功能:
創建項目

nest new pipe -p npm

1719120039619.png
修改 app.controller.ts 可以看到這個接口默認接收test的字符串參數

import { Controller, Get, Query } from '@nestjs/common';
import { AppService } from './app.service';@Controller()
export class AppController {constructor(private readonly appService: AppService) { }@Get()getHello(@Query('test') test: string): string {return test;}
}

1、ParseIntPipe

我們可以使用ParseIntPipe 將接收的字符串參數轉為整數:

import { Controller, Get, ParseIntPipe, Query } from '@nestjs/common';
import { AppService } from './app.service';@Controller()
export class AppController {constructor(private readonly appService: AppService) { }@Get()getHello(@Query('test', ParseIntPipe) test: string): string {return test+10;}
}

訪問接口 http://localhost:3000/?test=100 可以看到參數test傳入 100 變成了 110
1719120853656.png
且當我們傳入的參數不能轉為init時 則會報錯 例如下面 訪問 http://localhost:3000/?test=ww
1719120993724.png
這個返回的報錯 我們也可以自定義 但是這種方式需要使用new XxxPipe 的方式 例如指定狀態碼為404

import { Controller, Get, HttpStatus, ParseIntPipe, Query } from '@nestjs/common';
import { AppService } from './app.service';@Controller()
export class AppController {constructor(private readonly appService: AppService) { }@Get()getHello(@Query('test', new ParseIntPipe({errorHttpStatusCode: HttpStatus.NOT_FOUND,})) test: string): string {return test + 10;}
}

1719121317498.png
同時也可以拋出異常再進行處理

import { Controller, Get, HttpException, HttpStatus, ParseIntPipe, Query } from '@nestjs/common';
import { AppService } from './app.service';@Controller()
export class AppController {constructor(private readonly appService: AppService) { }@Get()getHello(@Query('test', new ParseIntPipe({errorHttpStatusCode: HttpStatus.NOT_FOUND,exceptionFactory(error) {console.log(error);throw new HttpException('測試報錯' + error, HttpStatus.NOT_IMPLEMENTED)},})) test: string): string {return test + 10;}
}

1719121515372.png

2、ParseFloatPipe

ParseFloatPipe 的作用是將參數轉為float 類型
我們新建一個接口: test

import { Controller, Get, HttpException, HttpStatus, ParseFloatPipe, ParseIntPipe, Query } from '@nestjs/common';
import { AppService } from './app.service';@Controller()
export class AppController {constructor(private readonly appService: AppService) { }@Get()getHello(@Query('test', new ParseIntPipe({errorHttpStatusCode: HttpStatus.NOT_FOUND,exceptionFactory(error) {console.log(error);throw new HttpException('測試報錯' + error, HttpStatus.NOT_IMPLEMENTED)},})) test: string): string {return test + 10;}@Get('test')getTest(@Query('test', ParseFloatPipe) test: number) {return test + 10;}
}

訪問 http://localhost:3000/test?test=10.4
1719122081715.png
同樣可以new ParseFloatPipe 的形式,傳入 errorHttpStatusCode 和 exceptionFactory

3、ParseBoolPipe

用于將傳入的字符串轉換為布爾值。

@Get('boolean')getBoolean(@Query('test') test: boolean) {return test;}

訪問 http://localhost:3000/boolean?test=false
1719122405754.png

4、ParseArrayPipe

用于將傳入的字符串轉換為數組。

@Get('array')getArray(@Query('test', ParseArrayPipe) test: number[]) {return test.reduce((pre, cur) => pre + cur, 0);}

保存代碼可以發現報錯了 提示需要class-validator 這個包
1719122693022.pngclass-class-class-validator 允許使用基于裝飾器和非裝飾器的驗證。 內部使用 validator.js 來執行驗證。

pnpm install class-validator

安裝之后啟動 發現還是報錯 缺少 class-transformer
class-transformer 允許您將普通對象轉換為類的某個實例,反之亦然。 此外,它還允許根據條件序列化/反序列化對象。 這個工具在前端和后端都非常有用。
1719123624634.png

pnpm install class-transformer 

訪問 http://localhost:3000/array?test=1,2,3,4
1719123834101.png
可以發現 每一項都提取出來了但是類型還是string 沒有轉換成number類型
此時需要 new XxxPipe 的方式傳入參數:

@Get('array')getArray(@Query('test', new ParseArrayPipe({items: Number,})) test: number[]) {return test.reduce((pre, cur) => pre + cur, 0);}

再次訪問 http://localhost:3000/array?test=1,2,3,4
1719123963798.png
同時還可以指定傳入時的分割符: separator: ‘/’,

@Get('array')getArray(@Query('test', new ParseArrayPipe({items: Number,separator: '/',})) test: number[]) {return test.reduce((pre, cur) => pre + cur, 0);}

訪問 http://localhost:3000/array?test=1/2/3/4
1719124196570.png
當我們沒有傳入參數的時候會報錯:
image.png
我們可以通過設置 optional 來實現不傳參數不報錯

  @Get('array')getArray(@Query('test', new ParseArrayPipe({items: Number,separator: '/',optional: true,})) test: number[]) {return test}

1719124324325.png

5、ParseEnumPipe

用于將傳入的字符串轉換為枚舉類型。

import { Controller, Get, HttpException, HttpStatus, ParseArrayPipe, ParseEnumPipe, ParseFloatPipe, ParseIntPipe, Query } from '@nestjs/common';
import { AppService } from './app.service';enum TestEnum {A = 'A111',B = 'B111',
}@Controller()
export class AppController {constructor(private readonly appService: AppService) { }@Get()getHello(@Query('test', new ParseIntPipe({errorHttpStatusCode: HttpStatus.NOT_FOUND,exceptionFactory(error) {console.log(error);throw new HttpException('測試報錯' + error, HttpStatus.NOT_IMPLEMENTED)},})) test: string): string {return test + 10;}@Get('test')getTest(@Query('test', ParseFloatPipe) test: number) {return test + 10;}@Get('boolean')getBoolean(@Query('test') test: boolean) {return test;}@Get('array')getArray(@Query('test', new ParseArrayPipe({items: Number,separator: '/',optional: true,})) test: number[]) {return test}@Get('enum/:test')getEnum(@Query('test', new ParseEnumPipe(TestEnum)) test: TestEnum) {return test}
}

訪問 http://localhost:3000/enum/111
1719126381961.png
當我們傳的參數不是枚舉定義的類型時會報錯
訪問 http://localhost:3000/enum/555
1719126484884.png

6、 ParseUUIDPipe

用于將傳入的字符串轉換為 UUID。在參數里,可以用 ParseUUIDPipe 來校驗是否是 UUID
首先我們安裝一下 uuid 用于生成uuid

pnpm install uuid

接著我們實現2個接口 getUuid getUuid2

import { Controller, Get, HttpException, HttpStatus, Param, ParseArrayPipe, ParseEnumPipe, ParseFloatPipe, ParseIntPipe, ParseUUIDPipe, Query } from '@nestjs/common';
import { AppService } from './app.service';const uuid = require('uuid');enum TestEnum {A = '111',B = '222',C = '333'
}@Controller()
export class AppController {constructor(private readonly appService: AppService) { }@Get()getHello(@Query('test', new ParseIntPipe({errorHttpStatusCode: HttpStatus.NOT_FOUND,exceptionFactory(error) {console.log(error);throw new HttpException('測試報錯' + error, HttpStatus.NOT_IMPLEMENTED)},})) test: string): string {return test + 10;}@Get('test')getTest(@Query('test', ParseFloatPipe) test: number) {return test + 10;}@Get('boolean')getBoolean(@Query('test') test: boolean) {return test;}@Get('array')getArray(@Query('test', new ParseArrayPipe({items: Number,separator: '/',optional: true,})) test: number[]) {return test}@Get('enum/:test')getEnum(@Param('test', new ParseEnumPipe(TestEnum)) e: TestEnum) {return e}@Get('uuid')getUuid() {return uuid.v4()}@Get('uuid/:uuid')getUuid2(@Param('uuid', new ParseUUIDPipe) uuid: string) {return uuid}
}

訪問 http://localhost:3000/uuid 獲取uuid
1719127289811.png
接著訪問 http://localhost:3000/uuid/0a5c5ce9-22ff-4091-85ef-523fcb64223c 可以看到正常訪問
1719127352975.png
但是如果參數不是正常的uuid那么會報錯
http://localhost:3000/uuid/xxx
1719127399773.png

7、DefaultValuePipe

用于在傳入的參數不存在時,給參數設置一個默認值。
創建一個接口:

@Get('default')getDefault(@Query('test', new DefaultValuePipe('test')) test: string) {return test}

當我們沒傳參數的時候 會使用默認值test http://localhost:3000/default
1719127714732.png
當我們傳參數之后將會返回參數 例如 http://localhost:3000/default?test=123456
1719127771860.png


8、自定義Pipe

首先創建一個 pipe:

nest g pipe www --flat --no-spec

www.pipe.ts:

import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';@Injectable()
export class WwwPipe implements PipeTransform {transform(value: any, metadata: ArgumentMetadata) {console.log(value,metadata);return 'www';}
}

增加接口:

  @Get('www')getWww(@Query('test', WwwPipe) test: string, @Query('test2', WwwPipe) test2: string) {return test + test2}

瀏覽器訪問 http://localhost:3000/www?test=1234&test2=1
1719128253615.png
這就是Pipe返回的值
1719128288386.png
控制臺打印了 value 就是 query、param 的值,而 metadata 里包含 type、metatype、data
1719129484281.png
1719129507003.png
type 就是 @Query、@Param、@Body 裝飾器,或者自定義裝飾器
metatype 是參數的 ts 類型
data 參數值

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41013.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41013.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41013.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux進階】文件系統5——ext2文件系統(inode)

1.再談inode (1) 理解inode,要從文件儲存說起。 文件儲存在硬盤上,硬盤的最小存儲單位叫做"扇區"(Sector)。每個扇區儲存512字節(相當于0.5KB)。操作系統讀取硬盤的時候,不會一個個…

記錄excel表生成一列按七天一個周期的方法

使用excel生成每七天一個周期的列。如下圖所示: 針對第一列的生成辦法,使用如下函數: TEXT(DATE(2024,1,1)(ROW()-2)*7,"yyyy/m/d")&" - "&TEXT(DATE(2024,1,1)(ROW()-1)*7-1,"yyyy/m/d") 特此記錄。…

charles使用教程

安裝與配置 下載鏈接:https://www.charlesproxy.com/download/ 進行移動端抓包: 電腦端配置: 關閉防火墻 Proxy–>勾選 macOS Proxy Proxy–>Proxy Setting–>填入代理端口8888–>勾選Enable transparent http proxying 安裝c…

俄羅斯方塊的python實現

俄羅斯方塊游戲是一種經典的拼圖游戲,玩家需要將不同形狀的方塊拼接在一起,使得每一行都被完全填滿,從而清除這一行并獲得積分。以下是該游戲的算法描述: 1. 初始化 初始化游戲界面,設置屏幕大小、方塊大小、網格大小…

昇思25天學習打卡營第1天|初識MindSpore

# 打卡 day1 目錄 # 打卡 day1 初識MindSpore 昇思 MindSpore 是什么? 昇思 MindSpore 優勢|特點 昇思 MindSpore 不足 官方生態學習地址 初識MindSpore 昇思 MindSpore 是什么? 昇思MindSpore 是全場景深度學習架構,為開發者提供了全…

女生學計算機好不好?感覺計算機分有點高……?

眾所周知,在國內的高校里,計算機專業的女生是非常少的,很多小班30人左右,但是每個班女生人數只有個位數。這就給很多人一個感覺,是不是女生天生就不適合學這個東西呢?女生是不是也應該放棄呢?當…

ubuntu 進入命令行

在Ubuntu中,有幾種方法可以進入命令行界面: 啟動時選擇命令行模式: 在計算機啟動時,如果安裝了GRUB引導加載器,可以通過GRUB菜單選擇進入命令行模式。這通常涉及到在啟動時按下Shift鍵或其他指定鍵來顯示GRUB菜單&…

常見算法和Lambda

常見算法和Lambda 文章目錄 常見算法和Lambda常見算法查找算法基本查找(順序查找)二分查找/折半查找插值查找斐波那契查找分塊查找擴展的分塊查找(無規律的數據) 常見排序算法冒泡排序選擇排序插入排序快速排序遞歸快速排序 Array…

SpringBoot新手快速入門系列教程二:MySql5.7.44的免安裝版本下載和配置,以及簡單的Mysql生存指令指南。

我們要如何選擇MySql 目前主流的Mysql有5.0、8.0、9.0 主要區別 MySQL 5.0 發布年份:2005年特性: 基礎事務支持存儲過程、觸發器、視圖基礎存儲引擎(如MyISAM、InnoDB)外鍵支持基本的全文搜索性能和擴展性: 相對較…

2024年江蘇省研究生數學建模競賽B題火箭煙幕彈運用策略優化論文和代碼分析

經過不懈的努力, 2024年江蘇省研究生數學建模競賽B題火箭煙幕彈運用策略優化論文和代碼已完成,代碼為B題全部問題的代碼,論文包括摘要、問題重述、問題分析、模型假設、符號說明、模型的建立和求解(問題1模型的建立和求解、問題2模…

[學習筆記]SQL學習筆記(連載中。。。)

學習視頻:【數據庫】SQL 3小時快速入門 #數據庫教程 #SQL教程 #MySQL教程 #database#Python連接數據庫 目錄 1.SQL的基礎知識1.1.表(table)和鍵(key)1.2.外鍵、聯合主鍵 2.MySQL安裝(略,請自行參考視頻)3.基本的MySQL語法3.1.規…

進程控制-fork函數

一個進程,包括代碼、數據和分配給進程的資源。 fork ()函數通過系統調用創建一個與原來進程幾乎完全相同的進程,也就是兩個進程可以做完全相同的事,但如果初始參數或者傳入的變量不同,兩個進程也可以做不同…

DatawhaleAI夏令營2024 Task2

#AI夏令營 #Datawhale #夏令營 賽題解析一、Baseline詳解1.1 環境配置1.2 數據處理任務理解2.3 prompt設計2.4 數據抽取 二、完整代碼總結 賽題解析 賽事背景 在數字化時代,企業積累了大量對話數據,這些數據不僅是交流記錄,還隱藏著寶貴的信…

【鴻蒙學習筆記】@Link裝飾器:父子雙向同步

官方文檔:Link裝飾器:父子雙向同步 目錄標題 [Q&A] Link裝飾器作用 [Q&A] Link裝飾器特點樣例:簡單類型樣例:數組類型樣例:Map類型樣例:Set類型樣例:聯合類型 [Q&A] Link裝飾器作用…

信號與系統-實驗6-離散時間系統的 Z 域分析

一、實驗目的 1、掌握 z 變換及其性質;了解常用序列的 z 變換、逆 z 變換; 2、掌握利用 MATLAB 的符號運算實現 z 變換; 3、掌握利用 MATLAB 繪制離散系統零、極點圖的方法; 4、掌握利用 MATLAB 分析離散系統零、極點的方法&a…

字符串中的注意事項

在比較早的C/C版本中,經常可以看到推薦使用gets函數來進行整行字符串的輸入,就像下面這樣的簡單寫法即可輸入一整行: C gets(str);但是當輸入的字符串長度超過數組長度上限MAX_LEN時,gets函數會把超出的部分也一并讀進來&#x…

MySQL基礎篇(二)字符集以及校驗規則

在MySQL基礎篇(一)中,我們知道了如何創建數據庫,這篇文章帶大家了解創建的一些細節。 紅色框:可省略,作用如果存在相同的數據庫名稱,就不會再創建,反之,創建。 藍色框&…

uniapp 封裝請求

新建request文件夾 下新建index.js 和index.js 或者創建units文件放入index.js 和api文件夾放入index.js(api.js)//看公司規范 1. index.js // 全局請求封裝 // const base_url http://localhost:8080/devapi var base_url process.env.NODE_ENV development ? http://…

可用于多個微信管理的神器

以下僅是多微信聚合聊天管理界面: 可以在一個頁面上同時收發多個微信的消息,可以添加好友,通過好友請求。 可以修改昵稱,不受字數限制。 可以將常用圖片,文件等放入素材庫,方便聊天時查找和發送。 可以設置…

速盾:cdn 緩存圖片

現如今,互聯網已經成為我們日常生活中不可或缺的一部分。在我們使用互聯網時,經常會遇到圖片加載緩慢、文章打開慢等問題。為了解決這些問題,CDN(內容分發網絡)應運而生。CDN 是一種通過將數據緩存在世界各地的服務器上…