[NestJS]响应拦截器(统一接口返回格式)

本文介绍了NestJS中的拦截器概念,包括请求拦截器、响应拦截器和异常拦截器的作用,以及如何通过@Injectable和UseInterceptors实现拦截器的封装和使用。同时提到了全局拦截的配置方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拦截器介绍

在NestJS中,拦截器是一种强大的工具,用于在 HTTP 请求和响应的处理过程中插入自定义的逻辑。它们的作用就像是对整个请求-响应管道的一种控制器,允许您在处理请求或响应的不同阶段执行额外的任务。

通俗地说,NestJS拦截器就像是一位自动化的管家,可以在整个请求-响应过程中为您执行一些特定的任务。以下是一些通俗的描述:

  1. 请求拦截器:
    就像在餐厅点餐前,有个人会在你的请求前检查是否有会员卡、是否已登录等。在NestJS中,请求拦截器可以在处理请求之前执行一些任务,比如身份验证、请求日志记录等。
  2. 响应拦截器:
    就像在餐厅享用美食后,有个人会在你收到菜品前检查是否需要添加额外的调味品。在NestJS中,响应拦截器可以在处理响应之前执行一些任务,如处理错误、格式化响应数据等。
  3. 异常拦截器:
    就像在餐厅享受美食时,如果出现了不愉快的情况,有个人会负责解决问题。在NestJS中,异常拦截器用于在请求或响应处理过程中捕获和处理异常情况,使得应用程序能够更优雅地处理错误。

拦截器封装

import {
  Injectable,
  NestInterceptor,
  CallHandler,
  ExecutionContext,
} from '@nestjs/common';
import { Observable, map } from 'rxjs';

interface Data<T> {
  data: T;
  code: number;
  msg: string;
}

export class ResponseInterceptor<T> implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<Data<T>> {
    return next
      .handle()
      .pipe(
        map(({ data, msg = '请求成功', code = 200 }) => ({ code, msg, data })),
      );
  }
}

@Injectable() 装饰器将类标记为可被NestJS框架注入的服务。
ResponseInterceptor<T> 类实现了 NestInterceptor 接口。
intercept 方法是拦截器的核心,它接收 ExecutionContext 和 CallHandler,并返回一个 Observable<Data>。
next.handle() 调用了处理链中的下一个处理程序,即继续执行后续的拦截器或路由处理程序。
pipe(map(...)) 部分使用RxJS中的map操作符,将原始的响应数据进行转换,确保最终响应数据的结构符合定义的Data接口。

拦截器使用

import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { ResponseInterceptor } from './response.interceotor';


@Controller('test')
@UseInterceptors(ResponseInterceptor)
export class TestController {
  @Get()
  async getData() {
    return {
		data:'test',
		code:200,
		msg:'测试'
	}
  }
}

另一种方式为全局拦截,在main.ts中注册

app.useGlobalInterceptors(new ResponseInterceptor());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值