Menu
CoddyTech

Неизвестные поля

Часть раздела TypeScript и NestJS путешествия по Node.js на Coddy. Урок 16 из 24.

Клиент может отправить поля, о которых в вашем DTO ничего не сказано, например { "title": "x", "admin": true }, и они без изменений попадут в ваш код. У ValidationPipe есть два варианта обработки таких полей.

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

whitelist: true удаляет все поля без декоратора валидации до того, как тело запроса попадёт в ваш метод. Добавьте forbidNonWhitelisted: true, и вместо этого конвейер отклонит такое тело запроса с кодом 400 и сообщением "property admin should not exist". forbidNonWhitelisted работает только вместе с whitelist; сам по себе он ничего не делает.

Тихое удаление подходит для формы, которая отправляет лишние поля. Отклонение сообщает клиенту API об опечатке, например titel.

challenge icon

Задание

Легко

Клиент может отправить поля, о которых в вашем DTO ни слова, например "owner": "admin", и сейчас они попадают в ваш код без изменений. Запретите их в API, чтобы клиент с опечаткой или подозрительным дополнительным полем узнал об этом.

  1. В src/main.ts найдите ValidationPipe, который уже регистрируется в bootstrap. Передайте ему два параметра: whitelist: true, который удаляет все поля без декоратора валидации, и forbidNonWhitelisted: true, который отклоняет такое тело с кодом 400, а не удаляет поле. Второй параметр работает только вместе с первым.
  2. Больше ничего не меняйте. Тела, содержащие только title и done, по-прежнему будут работать, а неверный заголовок по-прежнему будет отклонён.

Попробуйте: отправьте POST-запрос с { "title": "Book flights", "owner": "admin" } на /tasks. Вы получите ответ 400:

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

Затем отправьте POST-запрос с { "title": "Book flights" }: ответ 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