Menu
CoddyTech

Các trường không xác định

Thuộc phần TypeScript và NestJS trong hành trình Node.js của Coddy. Bài học 16 trên 24.

Máy khách có thể gửi những trường mà DTO của bạn không hề đề cập đến, như { "title": "x", "admin": true }, và chúng đi vào code của bạn mà không bị thay đổi. ValidationPipe có hai tùy chọn để xử lý chúng.

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

whitelist: true sẽ xóa mọi trường không có decorator xác thực (validation decorator) trước khi phương thức của bạn nhận phần thân yêu cầu. Thêm forbidNonWhitelisted: true thì pipe sẽ từ chối phần thân yêu cầu đó, đồng thời trả về mã 400 và "property admin should not exist". forbidNonWhitelisted chỉ hoạt động khi dùng cùng với whitelist; nếu dùng riêng, tùy chọn này không có tác dụng.

Âm thầm xóa trường phù hợp với biểu mẫu gửi kèm dữ liệu đầu vào thừa. Từ chối yêu cầu sẽ giúp máy khách API biết mình gõ sai, chẳng hạn như titel.

challenge icon

Thử thách

Dễ

Máy khách có thể gửi những trường mà DTO của bạn không nhắc đến, chẳng hạn như "owner": "admin", và hiện tại chúng đi thẳng vào code của bạn mà không bị thay đổi. Hãy khiến API từ chối chúng, để máy khách biết khi họ gõ nhầm hoặc gửi thêm trường đáng ngờ.

  1. Trong src/main.ts, tìm ValidationPipe mà bootstrap đã đăng ký. Truyền vào hai tùy chọn: whitelist: true, tùy chọn này loại bỏ mọi trường không có trình trang trí xác thực, và forbidNonWhitelisted: true, tùy chọn này từ chối body như vậy với mã 400 thay vì loại bỏ trường đó. Tùy chọn thứ hai chỉ hoạt động khi dùng cùng tùy chọn thứ nhất.
  2. Đừng thay đổi gì khác. Body chỉ có title và done vẫn hoạt động, còn title không hợp lệ vẫn bị từ chối.

Thử nhé: Gửi POST { "title": "Book flights", "owner": "admin" } đến /tasks. Bạn nhận được mã 400:

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

Sau đó gửi POST { "title": "Book flights" }: mã 201 và tác vụ mới. { "title": 7 } vẫn nhận mã 400.

Tự làm thử

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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong TypeScript và NestJS

Tự luyện tập: Playground Express