拦截器
原创...大约 1 分钟
拦截器是用 @Injectable()
装饰器注释并实现 NestInterceptor
接口的类。
拦截器具有一组有用的功能,这些功能的灵感来自 面向方面编程 (AOP) 技术。 它们可以:
- 在方法执行之前/之后绑定额外的逻辑
- 转换函数返回的结果
- 转换函数抛出的异常
- 扩展基本功能行为
- 根据特定条件完全覆盖函数(例如,出于缓存目的)
现在我们生成一个拦截器
nest g itc ./interceptor/response
在src/interceptor
目录下,我们生成了一个响应拦截器
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class ResponseInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle();
}
}
简单修改
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Injectable()
export class ResponseInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle().pipe(
map((response) => {
return response + 1
}),
);;
}
}
使用
import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { UserService } from './user.service';
import { ResponseInterceptor } from 'src/interceptor/response/response.interceptor';
@UseInterceptors(ResponseInterceptor)
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) { }
@Get("")
findAll() {
return "哈哈哈哈哈哈"
}
}
也可以直接在路由上使用
import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { UserService } from './user.service';
import { ResponseInterceptor } from 'src/interceptor/response/response.interceptor';
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) { }
@UseInterceptors(ResponseInterceptor)
@Get("")
findAll() {
return "哈哈哈哈哈哈"
}
}
此时,我们访问http://localhost:3000/user
进行查看,看到了哈哈哈哈哈哈1
,很明显拦截器将我们的响应数据进行了拦截处理
Powered by Waline v2.15.7