Menu
CoddyTech

サービス

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を呼び出している状態から始めます。

challenge icon

チャレンジ

簡単
  • 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のロジックをコントローラーからここに移してください。
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

TypeScriptとNestJSのすべてのレッスン