Menu
CoddyTech

パースパイプ

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

GET /tasks/abcは404「Task NaN not found」を返しますが、abcはそもそもIDではありません。これは不正なリクエストなので、400を返すべきです。パイプは検証だけでなく、変換もできます。

@Get()
findAll(@Query('year', ParseIntPipe) year: number) {
    return this.reportsService.forYear(year);
}

パラメーター デコレーターの第2引数として渡されたParseIntPipeは、メソッドの実行前にテキストを数値に変換します。GET /reports?year=2026は数値の2026を渡すため、year: numberが正しく成立します。?year=soonは400「Validation failed (numeric string is expected)」を返し、メソッドは実行されません。ParseBoolPipeとParseUUIDPipeも同じように動作します。

challenge icon

チャレンジ

簡単
  • GET /tasks/abc と DELETE /tasks/abc は 400 を返します。
  • 数値の ID は以前と同様に機能し、存在しない ID は引き続き 404 を返します。
  • GET /tasks/abc を送信し、次に GET /tasks/1、続けて GET /tasks/9999 を送信します。

自分で試してみよう

import { Body, Controller, Delete, Get, HttpCode, Inject, Param, Post, Query } from '@nestjs/common';
import { CreateTaskDto } from './dto/create-task.dto';
import { Task, TasksService } from './tasks.service';

@Controller('tasks')
export class TasksController {
    constructor(
        private readonly tasksService: TasksService,
        @Inject('PAGE_SIZE') private readonly pageSize: number,
    ) {}

    @Get()
    findAll(@Query('done') done?: string, @Query('page') page = '1') {
        const tasks = this.tasksService.findAll(done);
        const current = Number(page);
        const start = (current - 1) * this.pageSize;
        return {
            items: tasks.slice(start, start + this.pageSize),
            page: current,
            total: tasks.length,
            pages: Math.ceil(tasks.length / this.pageSize),
        };
    }

    @Get(':id')
    findOne(@Param('id') id: string): Task {
        return this.tasksService.findOne(Number(id));
    }

    @Post()
    create(@Body() dto: CreateTaskDto): Task {
        return this.tasksService.create(dto);
    }

    @Delete(':id')
    @HttpCode(204)
    remove(@Param('id') id: string): void {
        this.tasksService.remove(Number(id));
    }
}

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