Menu
CoddyTech

未知のフィールド

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

クライアントは、{ "title": "x", "admin": true }のように、DTOで言及されていないフィールドを送信でき、それらは何も変更されずにコードに届きます。ValidationPipeには、そのようなフィールドに対する2つのオプションがあります。

app.useGlobalPipes(
    new ValidationPipe({ whitelist: true }),
);

whitelist: trueを指定すると、メソッドがリクエスト本文を受け取る前に、バリデーションデコレーターのないフィールドがすべて削除されます。forbidNonWhitelisted: trueを追加すると、代わりにパイプがそのようなリクエスト本文を拒否し、400と"property admin should not exist"を返します。forbidNonWhitelistedはwhitelistと併用した場合にのみ機能し、単独では何もしません。

余分な入力を送信するフォームには、ひそかに削除する方法が適しています。拒否すれば、titelのようなタイプミスをAPIクライアントに知らせることができます。

challenge icon

チャレンジ

簡単

クライアントは、DTOに記述されていない "owner": "admin" のようなフィールドを送信できます。現状では、それらは変更されずにコードへ届きます。APIで拒否するようにして、入力ミスや不審な追加フィールドがあればクライアントに知らせましょう。

  1. src/main.ts で、bootstrap がすでに登録している ValidationPipe を見つけます。2つのオプションを渡してください。whitelist: true は、バリデーションデコレーターのないフィールドをすべて削除します。forbidNonWhitelisted: true は、そのようなリクエスト本文からフィールドを削除する代わりに、400で拒否します。2つ目のオプションは、1つ目と併用した場合にのみ機能します。
  2. ほかは何も変更しないでください。title と done だけを含むリクエスト本文は引き続き機能し、不正なタイトルも引き続き拒否されます。

試してみましょう: { "title": "Book flights", "owner": "admin" } を /tasks にPOSTします。400が返ります。

{ "message": ["property owner should not exist"], "error": "Bad Request", "statusCode": 400 }

次に { "title": "Book flights" } をPOSTします。201と新しいタスクが返ります。{ "title": 7 } は引き続き400になります。

自分で試してみよう

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

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

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

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

自分で練習してみよう: Expressプレイグラウンド