Неизвестные поля
Часть раздела 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.
Задание
ЛегкоКлиент может отправить поля, о которых в вашем DTO ни слова, например "owner": "admin", и сейчас они попадают в ваш код без изменений. Запретите их в API, чтобы клиент с опечаткой или подозрительным дополнительным полем узнал об этом.
- В
src/main.tsнайдитеValidationPipe, который уже регистрируется вbootstrap. Передайте ему два параметра:whitelist: true, который удаляет все поля без декоратора валидации, иforbidNonWhitelisted: true, который отклоняет такое тело с кодом 400, а не удаляет поле. Второй параметр работает только вместе с первым. - Больше ничего не меняйте. Тела, содержащие только
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();
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела TypeScript и NestJS
Потренируйтесь самостоятельно: Песочница Express