Field yang Tidak Dikenal
Termasuk bagian TypeScript dan NestJS dalam perjalanan Node.js di Coddy. Pelajaran 16 dari 24.
client dapat mengirim field yang tidak pernah disebutkan DTO-mu, seperti { "title": "x", "admin": true }, dan field tersebut sampai ke kodemu tanpa perubahan. ValidationPipe memiliki dua opsi untuk menanganinya.
app.useGlobalPipes(
new ValidationPipe({ whitelist: true }),
);whitelist: true menghapus setiap field yang tidak memiliki dekorator validasi sebelum method-mu menerima isi permintaan. Tambahkan forbidNonWhitelisted: true dan pipe akan menolak isi permintaan tersebut, dengan kode 400 dan pesan "property admin should not exist". forbidNonWhitelisted hanya berfungsi bersama whitelist; jika digunakan sendiri, opsi ini tidak melakukan apa pun.
Menghapus field secara diam-diam cocok untuk formulir yang mengirim input tambahan. Menolak permintaan akan memberi tahu client API tentang kesalahan ketik, seperti titel.
Tantangan
MudahClient dapat mengirim field yang tidak pernah disebutkan DTO-mu, seperti "owner": "admin", dan saat ini field tersebut langsung sampai ke kodemu tanpa perubahan. Buat API menolaknya, agar client yang salah ketik atau menyertakan field tambahan secara diam-diam mengetahuinya.
- Di
src/main.ts, temukanValidationPipeyang sudah didaftarkan olehbootstrap. Berikan dua opsi:whitelist: true, yang menghapus setiap field tanpa dekorator validasi, danforbidNonWhitelisted: true, yang menolak body tersebut dengan 400, bukan menghapus field-nya. Opsi kedua hanya berfungsi bersama opsi pertama. - Jangan ubah apa pun lagi. Body yang hanya berisi
titledandonetetap berfungsi, dan title yang tidak valid tetap ditolak.
Coba: Kirim POST { "title": "Book flights", "owner": "admin" } ke /tasks. Kamu mendapatkan 400:
{ "message": ["property owner should not exist"], "error": "Bad Request", "statusCode": 400 }Lalu kirim POST { "title": "Book flights" }: 201 dan task baru. { "title": 7 } tetap mendapatkan 400.
Coba sendiri
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();
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di TypeScript dan NestJS
Latihan sendiri: Playground Express