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 相关文章推荐
js判断变量是否空值的代码
Oct 26 Javascript
基于JQuery的密码强度验证代码
Mar 01 Javascript
Jquery replace 字符替换实现代码
Dec 02 Javascript
javascript实现图片切换的幻灯片效果源代码
Dec 12 Javascript
js获取鼠标点击的位置实现思路及代码
May 09 Javascript
jQuery解析返回的xml和json方法详解
Jan 05 Javascript
JavaScript中的工厂函数(推荐)
Mar 08 Javascript
Vue.directive自定义指令的使用详解
Mar 10 Javascript
JavaScript之iterable_动力节点Java学院整理
Jun 29 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
Oct 18 Javascript
Windows下Node爬虫神器Puppeteer安装记
Jan 09 Javascript
webpack 动态批量加载文件的实现方法
Mar 19 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生成静态页
2006/11/25 PHP
PHP+MYSQL 出现乱码的解决方法
2008/08/08 PHP
php连接mssql的一些相关经验及注意事项
2013/02/05 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
js中获取事件对象的方法小结
2011/03/13 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
Javascript实现的简单右键菜单类
2015/09/23 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
简单介绍Python中的floor()方法
2015/05/15 Python
Python import用法以及与from...import的区别
2015/05/28 Python
Python sorted函数详解(高级篇)
2018/09/18 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
Python docx库用法示例分析
2019/02/16 Python
python pyinstaller 加载ui路径方法
2019/06/10 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
师范生自荐信
2013/10/27 职场文书
汽车专业毕业生自荐信
2013/11/03 职场文书
大二法英学生职业生涯规划范文
2014/02/27 职场文书
煤矿班组长竞聘书
2014/03/31 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
深入浅析Redis 集群伸缩原理
2021/05/15 Redis
Pytest中skip和skipif的具体使用方法
2021/06/30 Python