Menu
CoddyTech

タスクの作成

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)を指定すると変更できますが、作成処理ではそのままにしておきましょう。

challenge icon

チャレンジ

簡単

クライアントはタスクを読み取るだけでなく、追加する必要があります。クライアントから送信されたJSONを使ってタスクを作成するルートを追加しましょう。

  1. src/tasks/tasks.controller.tsで、TasksControllerにPOST /tasks用のメソッド(createと呼びます)を追加します。@Post()でマークし、パラメーターの@Body()でJSON本文を読み取ります。どちらも@nestjs/commonからインポートします。
  2. 本文のtitleを使って新しいタスクを作成します。他のタスクと重複しないidを割り当てます。this.tasks内の最大のidより1大きい値にしてください。新しいタスクは未完了なので、doneはfalseです。
  3. タスクをthis.tasksに追加し、後からGET /tasksとGET /tasks/:idで見つけられるようにします。新しいタスクを返します。
  4. ステータスは自分で設定しないでください。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プレイグラウンド