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 相关文章推荐
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
Feb 03 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
May 12 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
May 21 Javascript
基于jquery实现图片上传本地预览功能
Jan 08 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
Feb 06 Javascript
JS中传递参数的几种不同方法比较
Jan 20 Javascript
angularjs中ng-bind-html的用法总结
May 23 Javascript
Javascript刷新页面的实例
Sep 23 Javascript
小程序实现左滑删除功能
Oct 30 Javascript
JS Web Flex弹性盒子模型代码实例
Mar 10 Javascript
Javascript数组及类数组相关原理详解
Oct 29 Javascript
Vue实现小购物车功能
Dec 21 Vue.js
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 Token(令牌)设计
2008/03/15 PHP
php截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
php上传中文文件名乱码问题处理方案
2015/02/03 PHP
php上传大文件设置方法
2016/04/14 PHP
php实现在线通讯录功能(附源码)
2016/05/13 PHP
php自动载入类用法实例分析
2016/06/24 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
Javascript浅谈之引用类型
2013/12/18 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
jquery解决客户端跨域访问问题
2015/01/06 Javascript
JavaScript 学习笔记之操作符
2015/01/14 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
django session完成状态保持的方法
2018/11/27 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
Django之模板层的实现代码
2019/09/09 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
Python接口自动化测试的实现
2020/08/28 Python
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
英国现代市场:ARKET
2019/04/10 全球购物
2016年小学生教师节广播稿
2015/12/18 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
python如何为list实现find方法
2022/05/30 Python