未知のフィールド
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クライアントに知らせることができます。
チャレンジ
簡単クライアントは、DTOに記述されていない "owner": "admin" のようなフィールドを送信できます。現状では、それらは変更されずにコードへ届きます。APIで拒否するようにして、入力ミスや不審な追加フィールドがあればクライアントに知らせましょう。
src/main.tsで、bootstrapがすでに登録しているValidationPipeを見つけます。2つのオプションを渡してください。whitelist: trueは、バリデーションデコレーターのないフィールドをすべて削除します。forbidNonWhitelisted: trueは、そのようなリクエスト本文からフィールドを削除する代わりに、400で拒否します。2つ目のオプションは、1つ目と併用した場合にのみ機能します。- ほかは何も変更しないでください。
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();
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
TypeScriptとNestJSのすべてのレッスン
自分で練習してみよう: Expressプレイグラウンド