Nest.js 實戰 (一):使用過濾器優雅地統一處理響應體

前言

在我們實際的業務開發中,我們可以看到后端接口返回格式都有一定的要求,假如我們統一規定接口的統一返回格式為:

{data: any; // 業務數據code: number; // 狀態碼msg: string; // 響應信息timestamp: number; // 時間戳
}

那么在 Nest.js 中,我們應該如何處理呢?

定義響應狀態碼枚舉和類型

  1. src 目錄中新建 /enums/index.ts 文件:
 /*** @description: 響應碼*/export enum RESPONSE_CODE {NOSUCCESS = -1, // 表示請求成功,但操作未成功SUCCESS = 200, // 請求成功BAD_REQUEST = 400, // 請求錯誤UNAUTHORIZED = 401, // 未授權FORBIDDEN = 403, // 禁止訪問NOT_FOUND = 404, // 資源未找到INTERNAL_SERVER_ERROR = 500, // 服務器錯誤}/*** @description: 請求提示語*/export enum RESPONSE_MSG {SUCCESS = '請求成功',FAILURE = '請求失敗',}
  1. src 目錄中新建 /typings/index.d.ts 文件:
declare namespace Api {namespace Common {/*** @description: 全局響應體*/type Response<T = any> = {code: number; // 狀態碼data?: T; // 業務數據msg: string; // 響應信息timestamp: number; // 時間戳};/*** @description: 分頁數據*/type PageResponse<T = any> = {current?: number; // 頁碼size?: number; // 當前頁條數total?: number; // 總條數records: T[]; // 業務數據};}
}
  1. 我們可以編寫一個公共方法,專門處理接口的返回結果:
  import dayjs from 'dayjs';import { RESPONSE_CODE, RESPONSE_MSG } from '@/enums';import type { Response } from '@/types';/*** @description: 統一返回體*/export const responseMessage = <T = any>(data,msg: string = RESPONSE_MSG.SUCCESS,code: number = RESPONSE_CODE.SUCCESS,): Response<T> => ({ data, msg, code, timestamp: dayjs().valueOf() });

這里大家可以根據自己的實際業務需求修改。

定義響應體 DTO

首先,定義一個統一的響應數據傳輸對象(DTO),這將作為所有 API 響應的基本結構。

src 目錄中新建 /dto/response.dto.ts 文件:

import { ApiProperty } from '@nestjs/swagger';import { RESPONSE_CODE, RESPONSE_MSG } from '@/enums';export class ResponseDto {@ApiProperty({type: Number,description: '業務狀態碼',default: RESPONSE_CODE.SUCCESS,})code: number;@ApiProperty({type: String,description: '業務信息',default: RESPONSE_MSG.SUCCESS,})msg: string;@ApiProperty({ description: '業務數據' })data?: any;@ApiProperty({ type: Number, description: '時間戳', default: 1720685424078 })timestamp: number;
}

HttpException 異常過濾器

創建一個異常過濾器,它負責捕獲作為 HttpException 類實例的異常,并為它們設置自定義響應邏輯。

src 目錄中新建 /filter/http-exception.filter.ts 文件:

  import { ArgumentsHost, Catch, ExceptionFilter, HttpException } from '@nestjs/common';import { Response } from 'express';import { responseMessage } from '@/utils';// @Catch() 裝飾器綁定所需的元數據到異常過濾器上。它告訴 Nest這個特定的過濾器正在尋找@Catch(HttpException)export class HttpExceptionsFilter implements ExceptionFilter {catch(exception: HttpException, host: ArgumentsHost) {// 獲取上下文const ctx = host.switchToHttp();// 獲取響應體const response = ctx.getResponse<Response>();// 獲取狀態碼const statusCode = exception.getStatus();// 自定義異常返回體response.status(statusCode).json(responseMessage(null, exception.message, statusCode));}}

全局異常過濾器

創建一個全局異常過濾器來處理所有的異常,并將其轉換為統一的響應格式。

src 目錄中新建 /filter/all-exception.filter.ts 文件:

import {ArgumentsHost,Catch,ExceptionFilter,HttpException,HttpStatus,
} from '@nestjs/common';
import { Response } from 'express';import { responseMessage } from '@/utils';// @Catch() 裝飾器綁定所需的元數據到異常過濾器上。它告訴 Nest這個特定的過濾器正在尋找
@Catch()
export class AllExceptionsFilter implements ExceptionFilter {catch(exception: unknown, host: ArgumentsHost) {// 獲取上下文const ctx = host.switchToHttp();// 獲取響應體const response = ctx.getResponse<Response>();// 獲取狀態碼,判斷是HTTP異常還是服務器異常const statusCode =exception instanceof HttpException? exception.getStatus(): HttpStatus.INTERNAL_SERVER_ERROR;// 自定義異常返回體response.status(statusCode).json(responseMessage(null, '服務器內部錯誤!', statusCode));}
}

全局配置

main.ts 中注冊全局的異常過濾器。

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { AllExceptionsFilter } from '@/filter/all-exception.filter'; // 全局異常過濾器
import { HttpExceptionsFilter } from '@/filter/http-exception.filter'; // http 異常過濾器async function bootstrap() {const app = await NestFactory.create(AppModule);// 錯誤異常捕獲 和 過濾處理app.useGlobalFilters(new AllExceptionsFilter());app.useGlobalFilters(new HttpExceptionsFilter());await app.listen(3000);
}
bootstrap();

效果預覽

  1. 正常請求成功
    在這里插入圖片描述

  2. 當我們訪問一個不存在的接口時
    在這里插入圖片描述

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

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

相關文章

【智能算法改進】改進的麻雀搜索算法及其求解旅行商問題

目錄 1.算法原理2.改進點3.結果展示4.參考文獻5.代碼獲取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及實現 2.改進點 改進發現者更新位置 為了使 SSA 算法能夠避開向原點收斂的弊端, 將算法向最優位置跳躍的操作轉換為向最優位置的移動: X i ,…

自己動手寫一個滑動驗證碼組件(后端為Spring Boot項目)

近期參加的項目&#xff0c;主管丟給我一個任務&#xff0c;說要支持滑動驗證碼。我身為50歲的軟件攻城師&#xff0c;當時正背著雙手&#xff0c;好像一個受訓的保安似的&#xff0c;中規中矩地參加每日站會&#xff0c;心想滑動驗證碼在今時今日已經是標配了&#xff0c;司空…

一個篇文章告訴你一個APP前端搭建有多簡單

用uni-app 1.新建uni-app項目 點擊項目 2.創建 最后點擊右下方創建 3.添加tarbar 首先你要創建幾個頁面這里比如說我有兩個頁面的tarbar首頁(home)和我的(userIndex) 在pages目錄下右鍵新建頁面即可

從庫存超賣問題分析鎖和分布式鎖的應用(二)

本文從一個經典的庫存超賣問題分析說明常見鎖的應用&#xff0c;假設庫存資源存儲在Redis里面。 假設我們的減庫存代碼如下&#xff1a; Autowired StringRedisTemplate redisTemplate;public void deduct(){String stock redisTemplate.opsForValue().get("stock"…

JavaSE從零開始到精通

1.前置知識 JVM&#xff1a;java virtrual machine, java虛擬機, 專門用于執行java代碼的一款軟件。JRE&#xff1a;java runtime enviroment, java運行時環境, java官方提供的核心類庫. jre中包含了核心類庫和jvm。JDK: java development kit, java開發工具包, javac.exe, ja…

LVS+Keepalive高可用

1、keepalive 調度器的高可用 vip地址主備之間的切換&#xff0c;主在工作時&#xff0c;vip地址只在主上&#xff0c;vip漂移到備服務器。 在主備的優先級不變的情況下&#xff0c;主恢復工作&#xff0c;vip會飄回到住服務器 1、配優先級 2、配置vip和真實服務器 3、主…

我想做信號通路分析,但我就是不想學編程

“我想做信號通路分析&#xff0c;但我就是不想學編程。” “我又不是生信狗&#xff0c;學代碼會死。” “你們這些做生信的&#xff0c;整天把數據分析搞得神神秘秘&#xff0c;不就是怕被人搶飯碗而已嘛。” “這都沒分析出我想要的結果&#xff0c;不靠譜。” “你們做…

【自學安全防御】二、防火墻NAT智能選路綜合實驗

任務要求&#xff1a; &#xff08;銜接上一個實驗所以從第七點開始&#xff0c;但與上一個實驗關系不大&#xff09; 7&#xff0c;辦公區設備可以通過電信鏈路和移動鏈路上網(多對多的NAT&#xff0c;并且需要保留一個公網IP不能用來轉換) 8&#xff0c;分公司設備可以通過總…

使用Docker創建并運行一個create-react-app應用(超簡單)

創建并運行一個使用 Create React App (CRA) 創建的應用程序的 Docker 容器涉及幾個步驟。以下是一個詳細的過程&#xff0c;包括創建一個簡單的 React 應用、編寫 Dockerfile、構建鏡像以及運行容器。 步驟 1: 創建一個新的 React 應用 如果你還沒有一個 React 應用&#xf…

Java爬蟲安全策略:防止TikTok音頻抓取過程中的請求被攔截

摘要 在當今互聯網時代&#xff0c;數據采集已成為獲取信息的重要手段。然而&#xff0c;隨著反爬蟲技術的不斷進步&#xff0c;爬蟲開發者面臨著越來越多的挑戰。本文將探討Java爬蟲在抓取TikTok音頻時的安全策略&#xff0c;包括如何防止請求被攔截&#xff0c;以及如何提高…

RK3568 安卓12 EC20模塊NOCONN沒有ip的問題(已解決)

從網上東拼西湊找了不少教程&#xff0c;但是里面沒有提到rillib.so需要替換&#xff0c;替換掉就可以上網了&#xff0c;系統也有4G圖標了。 注意&#xff0c;這個rillib.so是移遠提供的。把他們提供的文件放到rk3568_android_sdk/vendor/rockchip/common/phone/lib下&#x…

Andriod Stdio新建Kotlin的Jetpack Compose簡單項目

1.選擇 No Activity 2.選擇kotlin 4.右鍵選擇 在目錄MyApplication下 New->Compose->Empty Project 出現下面的畫面 Finish 完成

C++——類和對象(中)

文章目錄 一、類的默認成員函數二、構造函數三、析構函數四、拷?構造函數五、賦值運算符重載1. 運算符重載2. 賦值運算符重載 六、取地址運算符重載const成員函數取地址運算符重載 七、應用&#xff1a;?期類實現Date.hDate.cpptest.cpp 一、類的默認成員函數 默認成員函數就…

技術成神之路:設計模式(七)狀態模式

1.介紹 狀態模式&#xff08;State Pattern&#xff09;是一種行為設計模式&#xff0c;它允許一個對象在其內部狀態改變時改變其行為。這個模式將狀態的相關行為封裝在獨立的狀態類中&#xff0c;并將不同狀態之間的轉換邏輯分離開來。 2.主要作用 狀態模式的主要作用是讓一個…

數據結構—鏈式二叉樹-C語言

代碼位置&#xff1a;test-c-2024: 對C語言習題代碼的練習 (gitee.com) 一、前言&#xff1a; 在現實中搜索二叉樹為常用的二叉樹之一&#xff0c;今天我們就要通過鏈表來實現搜索二叉樹。實現的操作有&#xff1a;建二叉樹、前序遍歷、中序遍歷、后序遍歷、求樹的節點個數、求…

SMU Summer 2024 Contest Round 4

SMU Summer 2024 Contest Round 4 2024.7.16 9:00————11:00 過題數3/7 補題數6/7 Made Up H and V Moving Piece Sum of Divisors Red and Green Apples Rem of Sum is Num Keep Connect A - Made Up 題解&#xff1a; 給定三個數組a&#xff0c;b&#xff0c;c&#xf…

MySQL日期和時間相關函數

目錄 1. 獲取當前時間和日期 2. 獲取當前日期 3. 獲取當前時間 4. 獲取單獨的年/月/日/時/分/秒 5. 添加時間間隔 date_add ( ) 6. 格式化日期 date_format ( ) 7. 字符串轉日期 str_to_date () 8. 第幾天 dayofxx 9. 當月最后一天 last_day ( ) 10. 日期差 datedif…

H. Beppa and SwerChat【雙指針】

思路分析&#xff1a;運用雙指針從后往前掃一遍&#xff0c;兩次分別記作數組a&#xff0c;b&#xff0c;分別使用雙指針i和j來掃&#xff0c;如果一樣就往前&#xff0c;如果不一樣&#xff0c;i–,ans #include<iostream> #include<cstring> #include<string…

SQL server 練習題2

課后作業 作業 1&#xff1a;自己查找方法&#xff0c;將 homework_1.xls 文件數據導入到 SQLServer 的 homework 數據庫中。數據導入完成后&#xff0c;把表名統一改為&#xff1a;外賣表 如下所示&#xff1a; 作業 2&#xff1a;找出所有在 2020 年 5 月 1 日至 5 月 31 …

Zookeeper之CAP理論及分布式一致性算法

CAP理論 CAP理論告訴我們&#xff0c;一個分布式系統不可能同時滿足以下三種 一致性&#xff08;C:consistency&#xff09;可用性&#xff08;A:Available&#xff09;分區容錯性&#xff08;P:Partition Tolerance&#xff09; 這三個基本要求&#xff0c;最多只能同時滿足…