博客系统搭建之拦截器和异常过滤器实现统一返回格式
2023-11-23 20:36:53
前言
在上一个章节中,我们实现了数据持久化,至此,我们已经拥有了一个能用的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构建一个博客系统。我们介绍了如何使用拦截器和异常过滤器来实现统一的返回格式。我们提供了代码示例和详细的教程,帮助您轻松构建自己的博客系统。