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