高瀬博道の技術ブログ

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

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

前回

takasehiromichiex.com

プロバイダ

Nestのクラスの多くは、プロバイダです。

プロバイダは、サービス、リポジトリ、ファクトリ、ヘルパなどがあります。

プロバイダは、依存関係として注入できる側面があります。

依存関係の注入を、Nestのランタイムに任せることができます。

サービス

プロバイダの1つ、サービスを作成していきましょう。

実は以前、こちらですでにサービスを作成しています。

takasehiromichiex.com

CLIを使用する場合は、以下のようになります。

$ nest g service cats

以下のようなソースコードがあります。

src/cats/cats.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class CatsService {}

インターフェース

まずは、Catインターフェースを作成します。

$ nest g interface cats

以下のファイルが生成されます。

src/cats/cats.interface.ts
export interface Cats {}

このインターフェースに、情報を足してみましょう。

src/cats/cats.interface.ts
export interface Cat {
    name: string;
    age: number;
    breed: string;
}

インターフェースからサービス

では、このインターフェースを扱う、サービスを定義してみます。

src/cats/cats.service.ts
import { Injectable } from '@nestjs/common';
import { Cat } from './cats.interface';

@Injectable()
export class CatsService {
    private readonly cats: Cat[] = [];

    create(cat: Cat) {
        this.cats.push(cat);
    }
    findAll(): Cat[] {
        return this.cats;
    }
}

サービスからコントローラ

では、このサービスを扱う、コントローラを定義してみます。

src/cats/cats.controller.ts
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
import { CatsService } from './cats.service';
import { Cat } from './cats.interface';

@Controller('cats')
export class CatsController {
    constructor(private catsService: CatsService) {}

    @Post()
    create(@Body() body: Cat) {
        this.catsService.create(body);
    }
    @Get()
    findAll(): Cat[] {
        return this.catsService.findAll();
    }
}

まず、constructorでサービスの注入を行っています。

private構文の短縮形により、変数の宣言と初期化を同時に行なっています。

また、getとpostのメソッドを作成し、それぞれ注入したサービスのメソッドを呼び出しています。

この状態で、postmanでまずPOST localhost:3000/catsを、x-www-form-urlencodedで、以下のBodyとともに呼び出します。

name: meow
age: 8
breed: dj maro

その後、GET localhost:3000/catsを呼び出すと、以下が返却されます。

[
    {
        "name": "meow",
        "age": "8",
        "breed": "dj maro"
    }
]

まとめ

ここまでで、

  • プロバイダについて
  • インターフェースの作成
  • サービスにおけるインターフェースの利用
  • コントローラにおけるサービスの利用

を学びました。

次回は、ミドルウェアについて掘り下げようと思います。

コード

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

github.com

takasehiromichiex.com