前回
プロバイダ
Nestのクラスの多くは、プロバイダです。
プロバイダは、サービス、リポジトリ、ファクトリ、ヘルパなどがあります。
プロバイダは、依存関係として注入できる側面があります。
依存関係の注入を、Nestのランタイムに任せることができます。
サービス
プロバイダの1つ、サービスを作成していきましょう。
実は以前、こちらですでにサービスを作成しています。
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" } ]
まとめ
ここまでで、
- プロバイダについて
- インターフェースの作成
- サービスにおけるインターフェースの利用
- コントローラにおけるサービスの利用
を学びました。
次回は、ミドルウェアについて掘り下げようと思います。
コード
今回のコードは、以下に格納しました。