返回

Node 框架 Nest.js:如何轻松实现请求结果统一返回数据格式

前端

引言

在设计 Nest.js 路由回调的返回格式时,一个常见的问题是如何统一处理不同接口的成功和失败响应。本文将介绍一种简单的方法,让你的 Nest.js 应用程序轻松实现请求结果统一返回数据格式。

统一数据格式

首先,我们需要定义一个统一的数据格式来表示请求结果。这里使用一个名为 ApiResponse 的通用类:

export class ApiResponse<T> {
  success: boolean;
  message?: string;
  data?: T;
}

这个类有两个属性:success 表示请求是否成功,message 是可选的,用于提供额外的信息,data 是可选的,用于包含请求的结果数据。

使用拦截器

为了自动将请求结果转换为 ApiResponse 格式,我们可以使用 Nest.js 的拦截器机制。拦截器是一种特殊的管道,可以在请求处理过程中执行特定的操作。

以下是一个自定义拦截器,负责将请求结果转换为 ApiResponse 格式:

import { Injectable, NestInterceptor, CallHandler, ExecutionContext, } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { ApiResponse } from './api-response.dto';

@Injectable()
export class ApiResponseInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<ApiResponse<any>> {
    return next.handle().pipe(map((data) => ({ success: true, data })));
  }
}

这个拦截器使用 RxJS 的 map 算子将请求结果映射到 ApiResponse 格式。对于成功的请求,它会将 success 设置为 true 并将结果数据存储在 data 中。

全局应用拦截器

为了在所有路由中应用此拦截器,我们需要在 app.module.ts 中进行全局注册:

import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { ApiResponseInterceptor } from './api-response.interceptor';

@Module({
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: ApiResponseInterceptor,
    },
  ],
})
export class AppModule {}

用法

现在,所有 Nest.js 路由控制器都可以通过返回 ApiResponse<T> 类型的数据来使用统一的数据格式。例如:

import { Controller, Get } from '@nestjs/common';
import { ApiResponse } from './api-response.dto';

@Controller('users')
export class UsersController {
  @Get()
  getUsers(): ApiResponse<User[]> {
    return { success: true, data: [] };
  }
}

结论

通过使用自定义拦截器和 ApiResponse 数据格式,我们可以轻松地在 Nest.js 应用程序中实现请求结果的统一返回格式。这种方法不仅可以提高代码的可重用性,还可以简化客户端的处理,因为它始终可以预期以一致的格式接收响应。