タスクの作成
CoddyのNode.jsジャーニー「TypeScriptとNestJS」セクションの一部。レッスン 6/24。
タスクを作成するクライアントは、リクエスト本文でJSONとしてタスクを送信し、保存されたタスクを受け取る必要があります。
@Post()
create(@Body() review: { stars: number }) {
this.reviews.push(review);
return review;
}@Post()は、コントローラーのパスに対するPOSTをメソッドに割り当て、@Body()は解析済みのJSONを渡します。NestはJSON本文を自動的に読み取るため、追加するexpress.json()はありません。
NestはPOSTに対して、新しいリソースが存在することを示すステータス201 Createdを返し、それ以外のすべてのメソッドには200を返します。メソッドに@HttpCode(200)を指定すると変更できますが、作成処理ではそのままにしておきましょう。
チャレンジ
簡単クライアントはタスクを読み取るだけでなく、追加する必要があります。クライアントから送信されたJSONを使ってタスクを作成するルートを追加しましょう。
src/tasks/tasks.controller.tsで、TasksControllerにPOST /tasks用のメソッド(createと呼びます)を追加します。@Post()でマークし、パラメーターの@Body()でJSON本文を読み取ります。どちらも@nestjs/commonからインポートします。- 本文の
titleを使って新しいタスクを作成します。他のタスクと重複しないidを割り当てます。this.tasks内の最大のidより1大きい値にしてください。新しいタスクは未完了なので、doneはfalseです。 - タスクを
this.tasksに追加し、後からGET /tasksとGET /tasks/:idで見つけられるようにします。新しいタスクを返します。 - ステータスは自分で設定しないでください。NestはPOSTに対して、自動的に201 Createdを返します。
試してみましょう:POSTを選び、パスに/tasksを指定し、本文に{ "title": "Buy milk" }を設定します。201が返され、次の結果が得られます。
{ "id": 4, "title": "Buy milk", "done": false }GET /tasks/4を送信すると、同じタスクが返されます。次に、空の本文{}でPOSTを送信します。まだ本文のチェックは行われないので、タイトルのないタスクとともに、やはり201が返されます。{ "id": 5, "done": false }。これについては「検証」の章で解決します。
自分で試してみよう
import { Controller, Get, Param, Query } 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(@Query('done') done?: string): Task[] {
if (done === undefined) {
return this.tasks;
}
return this.tasks.filter((task) => task.done === (done === 'true'));
}
@Get(':id')
findOne(@Param('id') id: string): Task | undefined {
return this.tasks.find((task) => task.id === Number(id));
}
}
TypeScriptとNestJSのすべてのレッスン
自分で練習してみよう: Expressプレイグラウンド