NestJS 7.x 折腾记: (6) 异常过滤器,取其精华去其糟粕!比如响应异常数据的包装~
前言
正如官方所说:
内置的异常层负责处理整个应用程序中的所有抛出的异常。
当捕获到未处理的异常时,最终用户将收到友好的响应。
NestJS提供了一波拿来即用的内置异常过滤器;
在@nestjs/common
里面,搜索下Exception就有~
我们来一个具体的例子(全局异常过滤),
基于内置的异常过滤器实现,采用第三方日志(pino)记录异常日志,
做一些处理并包裹返回信息;
效果图
实战
# 基于cli生成filter模板
nest g f common/filters/http-exception
http-exception.filter.ts
// 日期格式化库,很小巧,类moment 风格api
import * as dayjs from 'dayjs';import {ArgumentsHost,Catch,ExceptionFilter,HttpException,HttpStatus,
} from '@nestjs/common';
// nest默认底层是基于express封装,所以可以直接引入
import { Request, Response } from 'express';
// 第三方logger
import { Logger } from 'nestjs-pino';// 捕获请求异常类型
// 可以传递多个参数,所以你可以通过逗号分隔来为多个类型的异常设置过滤器。
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {// 我们要把异常塞到自定义logger,必须引入对应的实例// 在构建函数声明定义下,从外部传入constructor(private readonly logger: Logger) {}catch(exception: HttpException, host: ArgumentsHost) {// 把请求相关的参数转成标准http的上下文// 有兴趣可以点进去,GPRC,WEBSOCKET都能直接转换// 也能直接拿到一些参数的及返回上下文类型const ctx = host.switchToHttp();// 响应体const response = ctx.getResponse<Response>();// 请求体const request = ctx.getRequest<Request>();// 判断状态是否为请求异常,否则直接抛回来服务内部错误const status =exception instanceof HttpException? exception.getStatus(): HttpStatus.INTERNAL_SERVER_ERROR;// 此刻的时间const nowDate = dayjs(Date.now()).format('YYYY-MM-DDTHH:mm:ss');// 包装异常信息const errorResponse = {statusCode: status,message: exception.message,error: exception.name,date: nowDate,path: request.url,};// 记录异常信息到第三方loggerthis.logger.error(`【${nowDate}】${request.method} ${request.url} query:${JSON.stringify(request.query,)} params:${JSON.stringify(request.params)} body:${JSON.stringify(request.body,)}`,JSON.stringify(errorResponse),'HttpExceptionFilter',);// 塞回去响应体,也就是客户端请求可以感知到的response.status(status).json(errorResponse);}
}
主入口(main.ts)
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './common/filters/http-exception.filter';
import { Logger } from 'nestjs-pino';
import { NestFactory } from '@nestjs/core';
async function bootstrap() {const app = await NestFactory.create(AppModule, {cors: false,logger: false,});// 获取pino logger实例 const logger = app.get(Logger);// nestjs-pino 取代nest loggerapp.useLogger(logger);// 设置全局异常过滤器app.useGlobalFilters(new HttpExceptionFilter(logger));await app.listen(configService.get('SERVE_LISTENER_PORT'));
}
bootstrap()
app.module.ts
若是只要特定模块生效可以使用Providers去实现,从核心模块导出;
import { Module } from '@nestjs/common';
// 包括网关,拦截器都可以走这种模式!
import { APP_FILTER } from '@nestjs/core';
import { HttpExceptionFilter } from './common/filters/http-exception.filter';
@Module({providers: [{provide: APP_FILTER,useClass: HttpExceptionFilter,},],
})
export class AppModule {}
若是加上@Global
装饰器也能达到全局模块的效果!
这个东东一般不推荐用在app.module,而是你需要导出的复用模块!
这里只是演示写法
import { Module,Global } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';@Global()
@Module({providers: [{provide: APP_FILTER,useClass: HttpExceptionFilter,},],
})
export class AppModule {}
@Global()
推荐用于给外部复用,又需要变成全局模块的,比如
import { Module, Global } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';@Global()
@Module({controllers: [CatsController],providers: [CatsService],exports: [CatsService],
})
export class CatsModule {}
总结
有不对之处请留言,会及时修正!谢谢阅读~
NestJS 7.x 折腾记: (6) 异常过滤器,取其精华去其糟粕!比如响应异常数据的包装~相关推荐
- NestJS 7.x 折腾记: (4) Swagger接入及相关用法
前言 swagger这东东,萝卜青菜各有所爱吧. 反正我呆的公司用这个,我用的也还行! 有兴趣的可以瞅瞅~ 说说优点吧, 可以精确的展示每个字段意义,只要注解写的到位! schema也能正常读取!还能 ...
- NestJS 7.x 折腾记: (5) 管道,一个好玩的东西!比如入参校验!
前言 管道这个词,若是有玩过Linux的小伙伴肯定知晓,比如(看图): 意思就git的提交记录以单行显示的前三条,而且提交概要中有build这个词的~ 在nest里面的管道,主要是用来做入参数据类型的 ...
- NestJS 7.x 折腾记: (3) 采用nestjs-pino作为Nest logger
前言 内置的logger不是很满足个人的需求, 所以找了下社区主流的日志实现, 从log4js,winston, 到选型pino . 是另外两个不好么,那倒不是. 萝卜青菜各有所爱吧, pino够轻量 ...
- NestJS 6.x折腾记- (0) 开胃菜, TypeORM 连接远程的MySQL(ssh tunnel)及Linux信息过滤裁切基础
前言 昨天发现的框架,看了下官方文档,号称Nodejs版本的spring(java) 开发模式有ng6既视感,这对有ng经验的小伙伴来说,莫名的亲切- 适合尝尝鲜,目前有1W+ star, 上正式线我 ...
- Spring Boot 实践折腾记(13):使用WebFlux构建响应式「推送API 」
西方著名宗教史家米尔恰·伊利亚德说,如果今天我们不生活在未来,那么未来,我们会生活在过去. 随着移动互联网的普及,基于C/S模式的APP开始了它的又一轮爆发式增长,过去,我们总说要去C/S模式,拥抱B ...
- 无法启动此程序,因为计算机中丢失iathook.dll,通过IAT+Hook调试Windows自定义未处理异常过滤器.pdf...
2009年第12期 计算机系统应用 Hoo n 通过IAT d k调试Wiows自定义未处理 异常过滤器① WindowsCustomFiltersforUnhandled IATHook Debug ...
- n1运行linux,斐讯N1折腾记:运行 Linux 及优化
此教程同样适用于斐讯 P1 咳咳咳,上篇教程教大家给斐讯 N1 降级并且刷了官改系统,可以当作一个电视盒子和下载机来使用. 有些小伙伴可能不想把它当作电视盒子,就想把它当作 NAS 或者是服务器,但是 ...
- armbian n1 桌面_斐讯N1折腾记:运行 Linux 及优化 | 米V米
最后更新时间:2019年03月25日 此教程同样适用于斐讯 P1 咳咳咳,上篇教程教大家给斐讯 N1 降级并且刷了官改系统,可以当作一个电视盒子和下载机来使用. 有些小伙伴可能不想把它当作电视盒子,就 ...
- Spring Boot 实践折腾记(11):使用 Spring 5的WebFlux快速构建效响应式REST API
关于Spring 5中的反应式编程支持Reactor类库,上一篇文章< Spring Boot 实践折腾记(10):2.0+版本中的反应式编程支持--Reactor>已经简要介绍过,Spr ...
最新文章
- mysql 硬解析 软解析_ORACLE sql语句的硬解析与软解析(收藏)
- hardnet68尝试
- xcode项目集成CocoaPods
- leetcode(34)在排序数组中查找元素的第一个和最后一个位置
- 5193. 删除字符使字符串变好
- 网易严选宣布退出双11?
- 如何去学会黑客技术,黑客电脑技术学习必备知识
- java 重力脚本_Java中非常简单的脚本解析器
- 一天一点数据结构+算法:复习堆的知识
- 转载自(梦想天空)【必备】史上最全的浏览器 CSS JS Hack 手册
- Android 中文API (38) —— Spinner
- 阿里矢量图标库的使用方法
- Nero Burning ROM 11.0.10500附序列号
- VBA学习笔记之单元格
- 《天才在左、疯子在右》随笔
- 凡客被裁员工“三问陈年” 官方不予回应
- OpenGL中phong光照模型详解
- 3d地球散点图加路径lines3D的实现,带有散点即路径的立体地球
- 传奇游戏应该选择什么样的服务器?
- 【论文翻译】Transferring GANs: generating images from limited data
热门文章
- 绿色免费企业管理软件V3.2┊财务、进销存、生产、人事管理、工资管理、考勤管理...
- ppt讲解计算机的组成,计算机的组成讲解.ppt
- 强烈建议 | 转行Python最好看一下这篇文章
- 基于react 的markdown编辑器
- 记录——红外成像光学系统进展与展望
- Linux流量监控工具 – iftop (最全面的iftop教程)
- Unity3d之ULua与XLua应用
- ubuntu下载好了输入法怎么切换
- 文献学习(part99)--Fast unfolding of communities in large networks
- 自己做量化交易软件(41)自编仿通达信公式及自编因子公式的计算速度比较及因子公式结果排名