nestjs返回给前端数据格式的封装实现


Posted in Javascript onFebruary 22, 2021

一般开发过程中不不会根据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返回给前端数据格式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
Mar 04 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
May 03 Javascript
写得不错的jquery table鼠标经过变色代码
Sep 27 Javascript
node.js中的fs.readFile方法使用说明
Dec 15 Javascript
jquery图片切换插件
Mar 16 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
Sep 14 Javascript
JQuery的Pager分页器实现代码
May 03 Javascript
剖析Angular Component的源码示例
Mar 23 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
Aug 09 jQuery
Vue中的作用域CSS和CSS模块的区别
Oct 09 Javascript
小程序云开发部署攻略(图文教程)
Oct 30 Javascript
前端深入理解Typescript泛型概念
Mar 09 Javascript
NestJs使用Mongoose对MongoDB操作的方法
Feb 22 #Javascript
linux服务器快速卸载安装node环境(简单上手)
Feb 22 #Javascript
k8s node节点重新加入master集群的实现
Feb 22 #Javascript
js实现简单图片拖拽效果
Feb 22 #Javascript
用vite搭建vue3应用的实现方法
Feb 22 #Vue.js
详解Vite的新体验
Feb 22 #Javascript
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 #Vue.js
You might like
php 过滤危险html代码
2009/06/29 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
Zend Framework入门教程之Zend_Mail用法示例
2016/12/08 PHP
php session的应用详细介绍
2017/03/22 PHP
JavaScript 动态生成方法的例子
2009/07/22 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
2011/01/17 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
浅析JavaScript动画
2015/06/10 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
详解webpack+ES6+Sass搭建多页面应用
2018/11/05 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
zbar解码二维码和条形码示例
2014/02/07 Python
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
实例讲解Python中SocketServer模块处理网络请求的用法
2016/06/28 Python
python中import学习备忘笔记
2017/01/24 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
解决Python使用列表副本的问题
2019/12/19 Python
GDAL 矢量属性数据修改方式(python)
2020/03/10 Python
python从ftp获取文件并下载到本地
2020/12/05 Python
Banana Republic欧盟:美国都市简约风格的代表品牌
2018/05/09 全球购物
CK加拿大官网:Calvin Klein加拿大
2020/03/14 全球购物
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
网络安全方面的面试题
2015/11/04 面试题
《四季》教学反思
2014/04/08 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
2014年党委工作总结
2014/11/22 职场文书
道德与公民自我评价
2015/03/09 职场文书
MBA推荐信怎么写
2015/03/25 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
90条交通安全宣传标语
2019/10/12 职场文书