响应拦截器
拦截器具有一组有用的功能,这些功能的灵感来自 面向方面编程 (AOP) 技术。 它们可以:
- 在方法执行之前/之后绑定额外的逻辑
- 转换函数返回的结果
- 转换函数抛出的异常
- 扩展基本功能行为
- 根据特定条件完全覆盖函数(例如,出于缓存目的)
尤其是 返回给前端的格式 是要统一的
不然前端该骂娘了
为了使路由专注业务 统一封装响应
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
export interface Data<T> {
data: T;
}
@Injectable()
export class TransformInterceptor<T> implements NestInterceptor<T, Data<T>> {
intercept(context: ExecutionContext, next: CallHandler): Observable<Data<T>> {
return next.handle().pipe(map(data => ({
data,
code:200,
message:'success'
})));
}
}
app.useGlobalInterceptors(new TransformInterceptor())
异常过滤器
Nest 带有一个内置的 异常层,它负责处理应用中所有未处理的异常。 当你的应用代码未处理异常时,该层会捕获该异常,然后自动发送适当的用户友好响应
import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, Response } from 'express';
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
const status = exception.getStatus();
response
.status(status)
.json({
code: status,
timestamp: new Date().toISOString(),
path: request.url,
});
}
}
app.useGlobalFilters(new HttpExceptionFilter())