Перейти к основному содержимому

Обзор декораторов

Что такое декораторы?​

Декораторы в express-cargo аннотируют поля класса, чтобы сообщить промежуточному ПО:

  • Откуда извлекать данные (например, body, query)
  • Как их валидировать
  • Как их преобразовывать

Когда вы передаёте класс в bindingCargo, промежуточное ПО читает эти декораторы, чтобы построить, проверить и преобразовать типобезопасный объект, который вы получаете через getCargo.

Категории декораторов​

Декораторы сгруппированы по роли, которую они играют в конвейере привязки.

КатегорияНазначениеПримерыСсылка
SourceВыбирает, откуда берётся значение поля@Body, @Query, @Header, @Uri / @Params, @Session, @UploadedFile, @UploadedFilesДекораторы источника, Декораторы загрузки файлов
RequestЧитает значение напрямую из Request Express@RequestДекораторы виртуальных полей
VirtualВычисляет поле из остальных полей объекта@VirtualДекораторы виртуальных полей
TransformИзменяет значение одного поля перед привязкой@TransformДекоратор преобразования
Type helperОпределяет, как исходное значение интерпретируется и приводится@Type, @List, @EnumДекораторы типов-помощников
ValidationПрименяет правила к значению поля@Min, @Max, @Email, @OneOf, …Декораторы валидации
Missing-valueРешает, что происходит, когда поле отсутствует@Default, @OptionalОбработка отсутствующих полей

Source, Request и Virtual отвечают на один и тот же вопрос — откуда берётся значение поля, — поэтому каждое поле должно нести ровно один из них, и совмещать их нельзя. @UploadedFile и @UploadedFiles — это декораторы источника, читающие вывод multipart-парсера, поэтому @UploadedFile и @Body на одном поле отклоняются так же, как @Body и @Query.

Более сложные сценарии @Type и @List — полиморфизм, циклические ссылки, массивы собственных классов — описаны в разделе Продвинутое использование: Преобразование типов и полиморфизм и Декоратор List.

Комбинирование декораторов​

Одно поле может нести декораторы из нескольких категорий. Они читаются вместе, чтобы привязать, преобразовать и проверить это поле:

import { Body, Transform, MinLength } from 'express-cargo'

class CreateUserRequest {
@Body('email') // Source: чтение из req.body.email
@Transform((value: string) => value.trim()) // Transform: нормализация значения
@MinLength(5) // Validation: применение правила
email!: string
}

Ограничение действует внутри категории, а не между категориями: поле принимает один источник, один тип-помощник и одну стратегию отсутствующего значения, тогда как декораторы валидации можно объединять свободно. bindingCargo() проверяет эти правила при регистрации маршрута и выбрасывает CargoSchemaError ещё до того, как сервер обработает запрос.

Каждая категория описана на своей собственной странице, ссылки на которые приведены выше.