NestJS——响应结果统一处理

对于响应结果统一处理,顾名思义,就是后端返回的数据结果包装成一个统一的对象返回到前端。也就是下面这种格式👇

ts 复制代码
// 成功时返回
{
    data, // data即我们返回的数据
    // 以下字段均可自定义,也可自行添加删除字段
    code: 0, 
    message: "成功",
    success: true
}

// 接口异常时返回
{
    // 以下字段均可自定义,也可自行添加删除字段
    success: false,
    time: new Date(),
    msg: exception.message,
    status,
    path: request.url,
}

接着我创建ResponseModule,ResponseController,ResponseService模块,我这里就手动创建了,你也可以使用nest g res xxx命令来创建,然后在ResponseModule中引入ResponseController和ResponseService。具体如下👇

对应代码:

ResponseModule.ts

ts 复制代码
import { Module } from '@nestjs/common';
import { ResponseController } from 'src/controller/ResponseController';
import { ResponseService } from 'src/service/ResponseService';

@Module({
  controllers: [ResponseController],
  providers: [ResponseService],
})
export class ResponseModule {}

ResponseController.ts

ts 复制代码
import { Controller } from '@nestjs/common';

@Controller('res')
export class ResponseController {}

ResponseService.ts

ts 复制代码
import { Injectable } from '@nestjs/common';

@Injectable()
export class ResponseService {}

然后我们将ResponseModule.ts引入到app.module.ts

ts 复制代码
import {Module} from '@nestjs/common';
import {AppController} from "./app.controller";
import {AppService} from "./app.service";
import { ResponseModule } from './modules/ResponseModule';

@Module({
    // 注入模块
    imports: [
        ResponseModule,
    ],
    controllers: [AppController],
    providers: [AppService],
})
export class AppModule {}

接着我们先测试一下接口能不能通,我这里就直接在ResponseController.ts中写个test方法来测试了。

ts 复制代码
import { Controller, Get } from '@nestjs/common';

@Controller('res')
export class ResponseController {
  @Get()
  test() {
    return '接口通过';
  }
}

非常顺序,接口进入主题。我们去封装一个统一的响应格式,我创建SuccessResponse.ts,创建类SuccessResponse去实现Nest内置的NestInterceptor接口,该接口需要实现intercept方法

SuccessResponse.ts

ts 复制代码
import {
  CallHandler,
  ExecutionContext,
  Injectable,
  NestInterceptor,
} from '@nestjs/common';
import { Observable, map } from 'rxjs';

interface Data<T> {
  data: T;
}

@Injectable()
export class SuccessResponse<T> implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<Data<T>> {
    return next.handle().pipe(
      map((data) => {
        return {
          data, // data即为 Service层或者Controller层的返回值
          code: 0,
          message: '请求成功',
          success: true,
        };
      }),
    );
  }
}

接着在main.ts去使用

然后我们在ResponseController.ts 和 ResponseService.ts 写一下返回逻辑

ResponseController.ts

ts 复制代码
import { ResponseService } from './../service/ResponseService';
import { Controller, Get } from '@nestjs/common';

@Controller('res')
export class ResponseController {
  constructor(private readonly responseService: ResponseService) {}
  @Get()
  test() {
    return this.responseService.test();
  }
}

ResponseService.ts

ts 复制代码
import { Injectable } from '@nestjs/common';

@Injectable()
export class ResponseService {
  test() {
    return {
      name: 'Lee',
      age: 18,
    };
  }
}

测试一下,返回结果已经包装成我们想要的对象

以上为接口返回成功的情况。下面来说说接口异常的情况,过程其实和以上类似,只是我们更换实现类。 我这里创建HttpFaild.ts去实现Nest内置的ExceptionFilter接口,接口有一个方法catch需要去实现。

HttpFaild.ts代码如下:

ts 复制代码
import {
  ArgumentsHost,
  Catch,
  ExceptionFilter,
  HttpException,
} from '@nestjs/common';
import { Response, Request } from 'express';

@Catch()
// 接口异常拦截器
export class HttpFaild implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const request = ctx.getRequest<Request>();
    const response = ctx.getResponse<Response>();
    const status = exception.getStatus();
    console.log(status, 'status');

    response.status(status).json({
      success: false,
      time: new Date(),
      msg: exception.message,
      status,
      path: request.url,
    });
  }
}

接着去main.ts使用

接着我在ResponseService去模拟异常

接口返回如下:

以上是本次文章内容,欢迎您的收看,喜欢点赞+收藏+关注,如有问题欢迎指正。

相关推荐
鱼与宇6 分钟前
前端Web(html+css+js+vue3)
前端
Lost of 程序猿42 分钟前
AOP 实战:面向切面编程从理论到落地
后端·asp.net·aop·面向切片变成
Lost of 程序猿1 小时前
ASP.NET Core 认证授权实战:从 JWT 到 Policy,设计一套企业级 RBAC 权限系统
后端·asp.net
Lost of 程序猿1 小时前
ASP.NET Core 后台任务全景:从 BackgroundService 到 Channel 队列,再到分布式调度
后端·asp.net·.netcore
倾颜2 小时前
NestJS 核心概念梳理:从 Module、Controller 到 Guard、Interceptor
后端·node.js·nestjs
雪芽蓝域zzs2 小时前
(六)打包优化 + Nginx 部署完整配置 + 项目收尾
前端·vue.js
研☆香2 小时前
聊一聊前端的常见字 关键字
开发语言·前端·javascript
东风破_2 小时前
JWT 1:从一个登录请求开始,理解 React 项目里的 API 层与 Mock
前端·后端
东风破_2 小时前
JWT 3:为什么 Token 要放进 Authorization?Axios 拦截器到底解决了什么?
前端·后端
东风破_2 小时前
JWT 5:路由守卫是什么?把整个 JWT 登录鉴权流程串起来
前端·后端