跳到主要内容

拦截器

响应拦截器

拦截器具有一系列有用的功能

  • 在函数执行之前/之后绑定额外的逻辑
  • 转换从函数返回的结果
  • 转换从函数抛出的异常
  • 扩展基本函数行为
  • 根据所选条件完全重写函数 (例如, 缓存目的)

现在我们的接口返回的内容没有格式,有字符串有对象,实际应该返回一个标准的json格式,就要给我们的数据做一个全局format,如

{
data, //数据
status:0,
message:"请求成功",
success:true
}

新建src/common/response.ts,Nest Js配合Rxjs格式化数据

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

interface Data<T> {
data: T;
}

@Injectable()
export class ResponseInterceptor<T = any> implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<Data<T>> {
return next.handle().pipe(
map((data) => {
return {
data,
status: 0,
success: true,
message: '请求成功',
};
}),
);
}
}

在main.ts 注册

main.ts
app.useGlobalInterceptors(new ResponseInterceptor());

调用了如下service,格式化效果如下图:

findAll() {
return `This action returns all user`;
}

image-20221120144005153

异常拦截器

新建src/common/filter.ts

filter.ts
import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
} from '@nestjs/common';
import { Request, Response } from 'express';

const getMessage = (exception: HttpException) => {
const responseExc = exception.getResponse();
if (typeof responseExc === 'string') {
return responseExc;
} else if (responseExc === null) {
return '';
} else {
return (responseExc as Error).message;
}
};

@Catch(HttpException)
export class FilterInterceptor implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const status = exception.getStatus();
const ctx = host.switchToHttp();
const request = ctx.getRequest<Request>();
const response = ctx.getResponse<Response>();
response.status(status).json({
error: exception.message,
message: getMessage(exception),
time: new Date().getTime(),
path: request.url,
success: false,
statusCode: status,
});
}
}

在main.ts 注册

main.ts
import { FilterInterceptor } from './common/filter';
app.useGlobalFilters(new FilterInterceptor());

访问一个不存在的路由

image-20221120223709536