除了middleware可以对原本request/response加工之外,nest.js提供interceptor可以对于程式要进入method之前与之后,执行一段程式或是对输入输出讯息做处理,称之Aspect-Oriented Programming(AOP)
Interceptor必须实作NestInterceptor接口
interceptor方法传入两个引数ExecutionContext
- ExecutionContext: 可以取得controller、及http相关信息(http context)
-
call$
: 这部分比较抽象,简单来说,call$
就是回传到client的response stream,如果interceptor没有回传call$,则等于是controller处理完后不会丢回response
以改变reponse内容为例,把原本的response内容再添加额外信息
新增transformRes.interceoptor.ts
import { ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Injectable()
export class TransformResInterceptor implements NestInterceptor { // 实现NestInterceptor接口
intercept(
context: ExecutionContext,
call$: Observable<any>,
): Observable<any> {
const controller = context.getClass().name; // 取得controller name
const handler = context.getHandler().name; // 取得method name
return call$.pipe(
map(data => // 原response內容
({ // 改变response內容
controller,
handler,
data,
})),
);
}
}
在app.module.ts注册interceptor
...
@Module({
imports: [SharedModule],
controllers: [AppController],
providers: [
AppService,
AuthGuard,
HttpExceptionFilter,
TransformResInterceptor,
],
})
export class AppModule implements NestModule{
...
用@UseInterceptors套用TransformResInterceptor
app.controller.ts
...
@Controller()
@UseFilters(HttpExceptionFilter)
@UseGuards(AuthGuard)
@UseInterceptors(TransformResInterceptor)
export class AppController {
redisClient: redis.RedisClient;
constructor(private appService: AppService){
// this.redisClient = redis.createClient(6379, 'redis-server');
// this.redisClient.set('counter', '0');
}
@Get()
sayHello(){
return this.appService.sayHello();
}
@Post()
@UsePipes(UserDTOValidationPipe)
@ReflectMetadata('roles', ['admin', 'superuser'])
create(@Body() platformDTO: PlatformDTO){
throw new HttpException('糟糕!您的要求有问题,请联系管理员', HttpStatus.BAD_REQUEST);
return `平台:${platformDTO.platformname}已建立`;
}
...
使用postman测试
2018110901.png2018110902.png
tuiguang.png推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。
网友评论