はじめに
この記事では、NestJS の Provider の実装方法について記載します。
開発環境
開発環境は以下の通りです。
- Windows11
- VSCode
- Node.js 20.5.0
- NestJS 10.0.0
- TypeScript 5.1.3
Provider とは
Provider の特徴は以下の通りです。
- Services, Repositories, Factories, Helpers などの Nest の基本的なクラスの総称
- 依存対象 (Dependency) として注入 (inject) される
Provider の実装
クラスに @Injectable()
デコレーターを追加することで、対象のクラスを Provider として扱うことができます。
以下の例では、CatsService
クラスに @Injectable()
デコレーターを追加しています。
cats.service.ts
import { Injectable } from '@nestjs/common';
import { Cat } from 'src/interfaces/cat.interface';
@Injectable()
export class CatsService {
private readonly cats: Cat[] = [];
create(cat: Cat) {
this.cats.push(cat);
}
findAll(): Cat[] {
return this.cats;
}
}
cats.intrface.ts
export interface Cat {
name: string;
age: number;
breed: string;
}
Provider の利用(DI)
先ほど実装した Provider を Controller で利用するためには、constructor
を使って DI(依存性の注入)をする必要があります。
以下の例では、CatsController
クラスに constructor(private catsService: CatsService) {}
を追加しています。
cats.controller.ts
import { Body, Controller, Get, Post } from '@nestjs/common';
import { CreateCatDTO } from 'src/dto/create-cat.dto';
import { Cat } from 'src/interfaces/cat.interface';
import { CatsService } from 'src/services/cats.service';
@Controller('cats')
export class CatsController {
constructor(private catsService: CatsService) {}
@Post()
async create(@Body() createCatDto: CreateCatDTO) {
this.catsService.create(createCatDto);
}
@Get()
async findAll(): Promise<Cat[]> {
return this.catsService.findAll();
}
}
create-cat.dto.ts
import { ApiProperty } from '@nestjs/swagger';
export class CreateCatDTO {
@ApiProperty()
name: string;
@ApiProperty()
age: number;
@ApiProperty()
breed: string;
}