メインコンテンツまでスキップ

9. Pipes

パイプの役割

パイプは、リクエストのデータを変換および検証するために使用されます。主にバリデーションやデータの正規化に使用され、リクエストがコントローラーのハンドラに渡される前に実行されます。パイプは、データの変換、バリデーション、サニタイズなどに利用されます。

基本的なパイプの使用方法

新しいパイプを作成するには、@Injectableデコレーターを使用してクラスを定義し、PipeTransformインターフェースを実装します。

基本的なパイプの例

以下は基本的なパイプの例です:

import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';

@Injectable()
export class ValidationPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
if (!value) {
throw new BadRequestException('Validation failed');
}
return value;
}
}

パイプの登録

パイプをコントローラーまたは特定のハンドラに適用するには、@UsePipesデコレーターを使用します。

import { Controller, Post, Body, UsePipes } from '@nestjs/common';
import { ValidationPipe } from './validation.pipe';

@Controller('cats')
export class CatsController {
@Post()
@UsePipes(ValidationPipe)
create(@Body() createCatDto: CreateCatDto) {
return 'This action adds a new cat';
}
}

グローバルパイプ

アプリケーション全体にパイプを適用する場合は、グローバルパイプとして登録します。

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from './validation.pipe';

async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
bootstrap();

カスタムパイプの実装例

データ変換パイプ

以下はリクエストデータを特定の形式に変換するカスタムパイプの例です:

import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';

@Injectable()
export class ParseIntPipe implements PipeTransform<string, number> {
transform(value: string, metadata: ArgumentMetadata): number {
const val = parseInt(value, 10);
if (isNaN(val)) {
throw new BadRequestException('Validation failed');
}
return val;
}
}

スキーマバリデーションパイプ

以下はJoiを使用してリクエストデータをバリデーションするカスタムパイプの例です:

import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
import * as Joi from 'joi';

@Injectable()
export class JoiValidationPipe implements PipeTransform {
constructor(private schema: Joi.ObjectSchema) {}

transform(value: any, metadata: ArgumentMetadata) {
const { error } = this.schema.validate(value);
if (error) {
throw new BadRequestException('Validation failed');
}
return value;
}
}

このパイプを使用するには、Joiスキーマを定義してインスタンス化します。

import * as Joi from 'joi';
import { JoiValidationPipe } from './joi-validation.pipe';

const createCatSchema = Joi.object({
name: Joi.string().required(),
age: Joi.number().required(),
breed: Joi.string().required(),
});

@Controller('cats')
export class CatsController {
@Post()
@UsePipes(new JoiValidationPipe(createCatSchema))
create(@Body() createCatDto: CreateCatDto) {
return 'This action adds a new cat';
}
}

カスタムエラーメッセージパイプ

以下はカスタムエラーメッセージを返すバリデーションパイプの例です:

import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';

@Injectable()
export class CustomErrorMessagePipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
if (!value) {
throw new BadRequestException('Custom error message: Validation failed');
}
return value;
}
}

これで、パイプの基本的な役割と使用方法について理解できました。次のセクションでは、テストの役割と使用方法について説明します。