nestjs返回給前端數據格式的封裝實現
一般開發過程中不不會根據httpcode來判斷接口請求成功與失敗的,而是會根據請求返回的數據,裡面加上code字段
一、返回的數據格式對比
1、直接返回的數據格式
{ "id": 1, "uuid": "cbbe7abc-b95e-48a0-8d24-b1ac93c45328", "name": "哈士奇1", "age": 12, "color": null, "createAt": "2019-07-25T09:13:30.000Z", "updateAt": "2019-07-25T09:13:30.000Z" }
2、我們自己包裝後的返回數據
{ code: 0, message: "請求成功", data: { "id": 1, "uuid": "cbbe7abc-b95e-48a0-8d24-b1ac93c45328", "name": "哈士奇1", "age": 12, "color": null, "createAt": "2019-07-25T09:13:30.000Z", "updateAt": "2019-07-25T09:13:30.000Z" } }
二、攔截全部的錯誤請求,統一返回格式
1、使用命令創建一個過濾器
nest g f filters/httpException
2、過濾器的代碼
import { ArgumentsHost, Catch, ExceptionFilter, HttpException, HttpStatus, Logger, } from '@nestjs/common'; @Catch(HttpException) export class HttpExceptionFilter implements ExceptionFilter { catch(exception: HttpException, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse(); const request = ctx.getRequest(); const message = exception.message.message; Logger.log('錯誤提示', message); const errorResponse = { data: { error: message, }, // 獲取全部的錯誤信息 message: '請求失敗', code: 1, // 自定義code url: request.originalUrl, // 錯誤的url地址 }; const status = exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR; // 設置返回的狀態碼、請求頭、發送錯誤信息 response.status(status); response.header('Content-Type', 'application/json; charset=utf-8'); response.send(errorResponse); } }
3、在main.ts中全局註冊
... import { HttpExceptionFilter } from './filters/http-exception.filter'; async function bootstrap() { ... // 全局註冊錯誤的過濾器 app.useGlobalFilters(new HttpExceptionFilter()); } bootstrap();
4、測試,返回的錯誤信息
{ "statusCode": 400, "error": "Bad Request", "data": { "message": [ { "age": "必須的整數" } ] }, "message": '請求失敗', "code": 1, "url": "/api/v1/cat" }
三、統一請求成功的返回數據
1、創建一個攔截器src/interceptor/transform.interceptor.ts
2、攔截器的代碼
import { Injectable, NestInterceptor, CallHandler, ExecutionContext, } from '@nestjs/common'; import { map } from 'rxjs/operators'; import { Observable } from 'rxjs'; interface Response<T> { data: T; } @Injectable() export class TransformInterceptor<T> implements NestInterceptor<T, Response<T>> { intercept( context: ExecutionContext, next: CallHandler<T>, ): Observable<Response<T>> { return next.handle().pipe( map(data => { return { data, code: 0, message: '請求成功', }; }), ); } }
3、全局註冊
... import { TransformInterceptor } from './interceptor/transform.interceptor'; async function bootstrap() { ... // 全局註冊攔截器 app.useGlobalInterceptors(new TransformInterceptor()); ... } bootstrap();
4、測試返回數據
{ "data": { "id": 1, "uuid": "cbbe7abc-b95e-48a0-8d24-b1ac93c45328", "name": "哈士奇1", "age": 12, "color": null, "createAt": "2019-07-25T09:13:30.000Z", "updateAt": "2019-07-25T09:13:30.000Z" }, "code": 0, "message": "請求成功" }
到此這篇關於nestjs返回給前端數據格式的封裝實現的文章就介紹到這瞭,更多相關nestjs返回給前端數據格式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Nest.js參數校驗和自定義返回數據格式詳解
- 可能是vue中使用axios最詳細教程
- Vue接口封裝的完整步驟記錄
- 詳解Flask開發技巧之異常處理
- axios的interceptors多次執行問題解決