Menu
CoddyTech

ルートパラメーター

CoddyのNode.jsジャーニー「TypeScriptとNestJS」セクションの一部。レッスン 4/24。

クライアントが必要とするのは、リスト全体ではなく1件のタスクであることがよくあります。パスにはパラメーターを含められます。これはリクエストごとに変わる部分です。

@Get(':isbn')
findOne(@Param('isbn') isbn: string) {
    return this.books.find((book) => book.isbn === isbn);
}

:isbnはパス内のその位置にある任意の値に一致するため、GET /books/978はこのメソッドに到達します。@Param('isbn')はその値をメソッドに渡します。値は常にテキストです。/books/42が返すのは文字列'42'であり、数値42ではありません。

名前を省略すると、@Param()は値ではなく、すべてのパラメーターを含むオブジェクト{ isbn: '978' }を返します。

challenge icon

チャレンジ

簡単

クライアントはリスト全体ではなく、特定のタスクだけを必要とすることがよくあります。その id でタスクを1つ返すルートを追加しましょう。

  1. src/tasks/tasks.controller.tsで、TasksControllerに2つ目のメソッド(findOneと名付けます)を追加して、GET /tasks/:idに対応させます。:idはパスのその位置にある任意の値を表すため、/tasks/2でこのルートに到達します。
  2. @Param('id')を使って、パスから id を読み取ります。@nestjs/commonからParamをインポートします。
  3. id は"2"のようなテキストとして届きますが、this.tasks内の id は数値であり、"2" === 2は false です。比較する前に id を数値に変換します。
  4. その id を持つタスクを返します。
  5. GET /tasksはそのままにします。引き続きリスト全体を返します。

試してみましょう: GET /tasks/2を送信します。200と次の内容が返ります。

{ "id": 2, "title": "Fix the login bug", "done": false }

GET /tasks/1とGET /tasks/3も送信します。次にGET /tasks/99を送信します。その id のタスクはないため、メソッドは何も返さず、Nestは200と空の本文を返します。今のところ、これは想定どおりです。クライアントには何も伝わりませんが、後のレッスンで修正します。

自分で試してみよう

import { Controller, Get } from '@nestjs/common';

interface Task {
    id: number;
    title: string;
    done: boolean;
}

@Controller('tasks')
export class TasksController {
    private tasks: Task[] = [
        { id: 1, title: 'Write the README', done: true },
        { id: 2, title: 'Fix the login bug', done: false },
        { id: 3, title: 'Plan the sprint', done: false },
    ];

    @Get()
    findAll(): Task[] {
        return this.tasks;
    }
}

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

自分で練習してみよう: Expressプレイグラウンド