サービス
CoddyのNode.jsジャーニー「TypeScriptとNestJS」セクションの一部。レッスン 6/17。
コントローラーがタスク自体を保持しているため、アプリのほかの部分からタスクにアクセスできません。データとロジックはプロバイダーに置きます。プロバイダーとは、Nest が作成し、必要とするクラスに渡すクラスです。
@Injectable()
export class BooksService {
private books = [{ title: 'Dune' }];
}
@Controller('books')
export class BooksController {
constructor(private readonly booksService: BooksService) {}
}@Injectable()はクラスを示し、モジュールではprovidersにそのクラスを登録します。クラスはコンストラクターで名前を指定してプロバイダーを要求します。これが依存性注入です。Nest はパラメーターの型を読み取ります。この型はデコレーターが付いたクラスについてコンパイラーによって保持されます。Nest はアプリ全体で使うインスタンスを1つ作成し、要求したすべてのクラスに同じインスタンスを渡します。データは共有され、テストでは代わりに偽物を渡すこともできます。
このレッスンでは、コントローラーがすでにthis.tasksServiceを呼び出している状態から始めます。
チャレンジ
簡単TasksServiceを注入可能にし、create(title)とremove(id)(レッスン5でコントローラーが行った処理)を実装して、TasksModuleのprovidersに登録します。TasksControllerのコンストラクターでこれを要求します。{ "title": "Buy milk" }を使ってPOST /tasksを送信し、次にGET /tasks、その後DELETE /tasks/99を送信します。
自分で試してみよう
import { NotFoundException } from '@nestjs/common';
export interface Task {
id: number;
title: string;
done: boolean;
createdAt?: string;
}
// このクラスを、Nestが注入できるプロバイダーにしてください。
export class TasksService {
private tasks: Task[] = [
{ id: 1, title: 'Write the README', done: true, createdAt: '2026-01-05T09:00:00.000Z' },
{ id: 2, title: 'Fix the login bug', done: false, createdAt: '2026-01-06T14:30:00.000Z' },
{ id: 3, title: 'Plan the sprint', done: false, createdAt: '2026-01-07T08:15:00.000Z' },
];
findAll(done?: string): Task[] {
if (done === undefined) {
return this.tasks;
}
return this.tasks.filter((task) => task.done === (done === 'true'));
}
findOne(id: number): Task {
const task = this.tasks.find((task) => task.id === id);
if (!task) {
throw new NotFoundException(`Task ${id} not found`);
}
return task;
}
// createとremoveのロジックをコントローラーからここに移してください。
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。