Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Client 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.

  1. Di src/main.ts, temukan ValidationPipe yang sudah didaftarkan oleh bootstrap. Berikan dua opsi: whitelist: true, yang menghapus setiap field tanpa dekorator validasi, dan forbidNonWhitelisted: true, yang menolak body tersebut dengan 400, bukan menghapus field-nya. Opsi kedua hanya berfungsi bersama opsi pertama.
  2. Jangan ubah apa pun lagi. Body yang hanya berisi title dan done tetap 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();
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di TypeScript dan NestJS

Latihan sendiri: Playground Express