ルートパラメーター
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' }を返します。
チャレンジ
簡単クライアントはリスト全体ではなく、特定のタスクだけを必要とすることがよくあります。その id でタスクを1つ返すルートを追加しましょう。
src/tasks/tasks.controller.tsで、TasksControllerに2つ目のメソッド(findOneと名付けます)を追加して、GET /tasks/:idに対応させます。:idはパスのその位置にある任意の値を表すため、/tasks/2でこのルートに到達します。@Param('id')を使って、パスから id を読み取ります。@nestjs/commonからParamをインポートします。- id は
"2"のようなテキストとして届きますが、this.tasks内の id は数値であり、"2" === 2は false です。比較する前に id を数値に変換します。 - その id を持つタスクを返します。
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プレイグラウンド