返回

博客系统搭建之拦截器和异常过滤器实现统一返回格式

前端

前言

在上一个章节中,我们实现了数据持久化,至此,我们已经拥有了一个能用的CURD模块了。在真实项目中,为了对接方便以及友好提示,服务端往往需要将返回的数据按照某种固定格式返回,比如:状态码、消息、数据三要素,而不仅仅是后端数据对象。

同时,我们需要对异常情况做一些处理,使其返回给前端的信息更加明确、友好,不会因为出现异常而导致整个应用崩溃。

使用拦截器实现统一返回格式

拦截器是一种在请求到达控制器之前或之后执行的特殊类。我们可以使用拦截器来修改请求或响应对象,也可以在请求或响应过程中执行一些额外的操作。

在NestJS中,我们可以通过创建一个实现NestJS Interceptor 接口的类来创建拦截器。例如,我们可以创建一个名为 TransformInterceptor 的拦截器类,如下所示:

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

@Injectable()
export class TransformInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(map(data => ({
      code: 0,
      message: 'success',
      data,
    })));
  }
}

在这个拦截器类中,我们实现了 intercept() 方法,该方法将在请求到达控制器之前或之后执行。在该方法中,我们使用RxJS的 map() 操作符来修改响应对象,将其转换为我们想要的统一返回格式。

然后,我们需要在我们的模块中注册这个拦截器。例如,我们可以这样做:

import { Module } from '@nestjs/common';
import { TransformInterceptor } from './transform.interceptor';

@Module({
  controllers: [],
  providers: [TransformInterceptor],
})
export class AppModule {}

这样,我们就成功地使用拦截器实现了统一的返回格式。

使用异常过滤器处理异常情况

异常过滤器是一种在发生异常时执行的特殊类。我们可以使用异常过滤器来捕获异常,并将其转换为我们想要的格式。

在NestJS中,我们可以通过创建一个实现NestJS ExceptionFilter 接口的类来创建异常过滤器。例如,我们可以创建一个名为 HttpExceptionFilter 的异常过滤器类,如下所示:

import { Injectable, Catch, ArgumentsHost, HttpException } from '@nestjs/common';

@Injectable()
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const request = ctx.getRequest();

    const status = exception.getStatus();
    const message = exception.message;

    response.status(status).json({
      code: status,
      message,
    });
  }
}

在这个异常过滤器类中,我们实现了 catch() 方法,该方法将在发生异常时执行。在该方法中,我们捕获了异常,并将其转换为我们想要的格式。

然后,我们需要在我们的模块中注册这个异常过滤器。例如,我们可以这样做:

import { Module } from '@nestjs/common';
import { HttpExceptionFilter } from './http-exception.filter';

@Module({
  controllers: [],
  providers: [HttpExceptionFilter],
})
export class AppModule {}

这样,我们就成功地使用异常过滤器处理了异常情况。

总结

在本文中,我们介绍了如何使用NestJS构建一个博客系统。我们介绍了如何使用拦截器和异常过滤器来实现统一的返回格式。我们提供了代码示例和详细的教程,帮助您轻松构建自己的博客系统。