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

Декоратор преобразования

Express-Cargo предоставляет декоратор для автоматического преобразования входящих данных запроса перед их привязкой к классу. Это полезно для таких задач, как нормализация пользовательского ввода (например, преобразование строки в нижний регистр) или парсинг строки, разделенной запятыми, в массив.

В отличие от виртуальных полей, которые объединяют существующие поля для создания нового, этот декоратор преобразования напрямую изменяет значение отдельного поля.

@Transform<T>(transformer: (value: T) => T)

Это основной декоратор для преобразования данных. Он принимает функцию-трансформер, которая получает необработанное значение из запроса и возвращает новое, преобразованное значение для поля.

  • transformer: Функция, которая принимает необработанное значение и возвращает преобразованное значение.

Пример использования

Этот пример демонстрирует, как можно использовать декоратор @Transform для нормализации и обработки данных запроса в желаемый формат. Это очень полезно для обработки разнообразных пользовательских вводов и обеспечения того, чтобы ваш API обрабатывал их последовательно, что повышает стабильность вашего приложения.

import express, { Request, Response } from 'express'
import { bindingCargo, getCargo, Query, Transform } from 'express-cargo'

// 1. Определите класс с правилами обработки и нормализации данных
class SearchRequest {
// Преобразует параметр запроса 'sortBy' в нижний регистр для последовательной сортировки
@Query()
@Transform((value: string) => value.toLowerCase())
sortBy!: string

// Удваивает значение параметра запроса 'count'
@Query()
@Transform((value: number) => value * 2)
count!: number
}

const app = express()
app.use(express.json())

// 2. Примените промежуточное ПО bindingCargo к маршруту
app.get('/search', bindingCargo(SearchRequest), (req: Request, res: Response) => {
// 3. Получите доступ к преобразованным данным с правильными типами
const searchParams = getCargo<SearchRequest>(req)

res.json({
message: 'Параметры поиска успешно преобразованы!',
data: searchParams,
// Проверьте тип преобразованных данных
sortByType: typeof searchParams.sortBy,
countType: typeof searchParams.count,
doubleCount: searchParams.count,
})
})

/*
Чтобы протестировать эту конечную точку, отправьте GET-запрос на /search.

Пример URL запроса:
http://localhost:3000/search?sortBy=TITLE&count=10
*/

Пример вывода

Когда осуществляется доступ к примеру URL запроса, промежуточное ПО bindingCargo обрабатывает параметры запроса. Декораторы @Transform затем нормализуют значение sortBy в строку нижнего регистра и удваивают значение count. Функция getCargo возвращает объект с этими преобразованными значениями.

{
"message": "Параметры поиска успешно преобразованы!",
"data": {
"sortBy": "title",
"count": 10
},
"sortByType": "string",
"countType": "number",
"doubleCount": 10
}