你可以创建一个 Nest.js 拦截器,以处理 HTTP 请求,并统一返回格式包括 codemessagedata。以下是一个示例拦截器的代码:

import { Injectable, NestInterceptor, ExecutionContext, CallHandler, HttpException, HttpStatus } from '@nestjs/common';
import { Observable, throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';

@Injectable()
export class ResponseInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(
      map((data) => ({
        code: 200, // 自定义成功状态码
        message: 'Success', // 自定义成功消息
        data, // 返回数据
      })),
      catchError((error) => {
        // 自定义错误处理逻辑
        const errorMessage = error.message || 'Internal Server Error';
        const statusCode = error instanceof HttpException ? error.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR;

        return throwError(new HttpException(
          {
            code: statusCode,
            message: errorMessage,
            data: null, // 可选的错误数据
          },
          statusCode,
        ));
      }),
    );
  }
}

在上述代码中,我们创建了一个名为 ResponseInterceptor 的拦截器,它实现了 Nest.js 的 NestInterceptor 接口。在 intercept 方法中,我们通过 next.handle() 获取到请求处理的 Observable,然后使用 map 操作符对返回数据进行包装,以满足统一的格式要求。

要在上述代码中处理异常情况并正确返回错误码,你可以在拦截器中添加错误处理逻辑,并自定义错误格式。

我们使用 catchError 操作符捕获异常,并将其转化为统一格式的错误响应。如果发生异常,我们创建一个包含自定义错误码、错误消息和可选的错误数据的 HttpException,并将其抛出。

这样,当控制器方法或服务方法中出现异常时,拦截器将会捕获并返回一个包含错误信息的响应。你可以根据需要自定义错误码、错误消息和错误数据,以满足项目的需求。

以下是一个示例,展示如何在拦截器中处理异常并返回错误响应:

你可以将这个拦截器应用于控制器方法或整个模块,以确保每个请求都会经过它,并返回统一格式的响应。以下是如何在控制器方法上应用该拦截器的示例:

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

@Controller('example')
@UseInterceptors(ResponseInterceptor) // 应用拦截器
export class ExampleController {
  @Get()
  async getData() {
    // 模拟返回数据
    const data = { message: 'Hello, Nest.js!' };
    return data;
  }
}

现在,每次调用 getData 控制器方法时,它都会自动经过 ResponseInterceptor 拦截器,并返回统一格式的响应。

请根据你的需求自定义成功状态码、成功消息和其他返回数据,以满足项目的要求。此外,你还可以在拦截器中处理错误情况,以确保错误响应也符合统一的格式。

发表评论