高瀬博道の技術ブログ

高瀬博道の技術ブログです。

もう2023年になったので、今さらNestJSに入門しようと思う - その19

前回

takasehiromichiex.com

デコレータ

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);
  }
}

作成したカスタムデコレータを設置しています。

まとめ

ここまでで、

  • カスタムデコレータについて

を学びました。

次回は、カスタムプロバイダについて掘り下げようと思います。

コード

今回のコードは、以下に格納しました。

github.com

takasehiromichiex.com