前回
インターセプタのレスポンスマッピング
handle()
はObservable
を返しますが、ストリームにはルートハンドラから返却された値が含まれているので、RxJSのmap()
を使用して簡単に変更することができます。
新しいインターセプタを作成しましょう。
$ nest g interceptor interceptor/transform
以下のファイルが作成されました。
src/interceptor/transform/transform.interceptor.ts
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common'; import { Observable } from 'rxjs'; @Injectable() export class TransformInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<any> { return next.handle(); } }
src/interceptor/transform/transform.logging.spec.ts
import { TransformInterceptor } from './transform.interceptor'; describe('TransformInterceptor', () => { it('should be defined', () => { expect(new TransformInterceptor()).toBeDefined(); }); });
インターセプタを修正します。
src/interceptor/transform/transform.interceptor.ts
import { CallHandler, ExecutionContext, Injectable, NestInterceptor, } from "@nestjs/common"; import { map, Observable } from "rxjs"; export interface Response<T> { data: T; } @Injectable() export class TransformInterceptor<T> implements NestInterceptor<T, Response<T>> { intercept( context: ExecutionContext, next: CallHandler ): Observable<Response<T>> { return next.handle().pipe(map((data) => ({ data }))); } }
レスポンスのdata
をオブジェクトにして返却しています。
コントローラにバインドします。
src/cats/cats.controller.ts
import { Body, Controller, Get, Post, UseInterceptors } from "@nestjs/common"; import { CreateCatDto } from "src/dto/cat/cat.dto"; import { Cat } from "./cats.interface"; import { CatsService } from "./cats.service"; import { ValidationPipe } from "../pipe/validation/validation.pipe"; import { LoggingInterceptor } from "src/interceptor/logging/logging.interceptor"; import { TransformInterceptor } from "src/interceptor/transform/transform.interceptor"; @Controller("cats") @UseInterceptors(LoggingInterceptor, TransformInterceptor) export class CatsController { constructor(private catsService: CatsService) {} @Post() create(@Body(new ValidationPipe()) createCatDto: CreateCatDto) { this.catsService.create(createCatDto); } @Get() findAll(): Cat[] { return this.catsService.findAll(); } }
postman
で、GET localhost:3000/cats
を呼び出すと、以下のように返却されます。
{ "data": [] }
まとめ
ここまでで、
- インターセプタのレスポンスマッピングの例
を学びました。
次回も、インターセプタを掘り下げようと思います。
コード
今回のコードは、以下に格納しました。