前回
デコレータ
Nestは、デコレータを中心に構築されています。
デコレータは、@
のプレフィックスをつけ、装飾するものの上に配置して適用します。
デコレータは、クラス、メソッド、プロパティにつけることができます。
パラメータデコレータ
通常、リクエストからプロパティを取り出すのは、以下のようになります。
const user = req.user;
これに関するカスタムデコレータを作成することができます。
$ nest g decorator decorator/user
以下のファイルが作成されます。
src/decorator/user/user.decorator.ts
import { SetMetadata } from '@nestjs/common'; export const User = (...args: string[]) => SetMetadata('user', args);
パラメータデコレータに修正します。
src/decorator/user/user.decorator.ts
import { createParamDecorator, ExecutionContext } from "@nestjs/common"; export const User = createParamDecorator( (data: unknown, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); return request.query.user; } );
その後、コントローラで使用できます。
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 { User } from "src/decorator/user/user.decorator"; @Controller("cats") 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(); } @Get("abc") async findOne(@User() user: any): Promise<void> { console.log(user); } }
作成したカスタムデコレータを設置しています。
まとめ
ここまでで、
- カスタムデコレータについて
を学びました。
次回は、カスタムプロバイダについて掘り下げようと思います。
コード
今回のコードは、以下に格納しました。