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 相关文章推荐
腾讯UED 漂亮的提示信息效果代码
Sep 12 Javascript
JS实现标签页效果(配合css)
Apr 03 Javascript
js编写一个简单的产品放大效果代码
Jun 27 Javascript
bootstrap模态框实现拖拽效果
Dec 14 Javascript
Vue.js开发环境快速搭建教程
Mar 17 Javascript
layui弹出层效果实现代码
May 19 Javascript
JavaScript学习笔记之惰性函数示例详解
Aug 27 Javascript
JavaScript判断输入是否为数字类型的方法总结
Sep 28 Javascript
使用express搭建一个简单的查询服务器的方法
Feb 09 Javascript
Node.Js中实现端口重用原理详解
May 03 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
Sep 03 Javascript
vue实现拖拽进度条
Mar 01 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
Protoss兵种对照表
2020/03/14 星际争霸
一个php作的文本留言本的例子(四)
2006/10/09 PHP
PHP 中关于ord($str)&amp;gt;0x80的详细说明
2012/09/23 PHP
Window下PHP三种运行方式图文详解
2013/06/11 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
php商品对比功能代码分享
2015/09/24 PHP
PHP pear安装配置教程
2016/05/14 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
2014/06/05 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
微信小程序 共用变量值的实现
2017/07/12 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
2018/04/18 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
2019/04/11 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
Python中的多重装饰器
2015/04/11 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
python lxml中etree的简单应用
2019/05/10 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
python基于event实现线程间通信控制
2020/01/13 Python
python+gdal+遥感图像拼接(mosaic)的实例
2020/03/10 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
一套Delphi的笔试题一
2016/02/14 面试题
总经理岗位职责
2013/11/09 职场文书
网站设计师的岗位职责
2013/11/21 职场文书
学校安全教育制度
2014/01/31 职场文书
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
golang 生成对应的数据表struct定义操作
2021/04/28 Golang
如何开发一个渐进式Web应用程序PWA
2021/05/10 Javascript