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

Декоратор списка

Декоратор @List в Express-Cargo позволяет автоматически привязывать и приводить типы массивов из запроса. Это полезно, когда вы ожидаете, что поле будет массивом определенного типа, например, строк, чисел или даже пользовательских объектов.

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

import express, { Router } from 'express'
import { Body, List, bindingCargo, getCargo } from 'express-cargo'

const router: Router = express.Router()

// 1. Определите пользовательский класс (необязательно)
class CustomClass {
@Body()
name!: string

@Body()
age!: number
}

// 2. Определите класс с полями массива
class ListSample {
@Body()
@List(String)
stringArray!: string[]

@Body()
@List(Number)
numberArray!: number[]

@Body()
@List(Boolean)
booleanArray!: boolean[]

@Body()
@List(Date)
dateArray!: Date[]

@Body()
@List('string')
stringLiteralArray!: string[]

@Body()
@List(CustomClass)
customClassArray!: CustomClass[]
}

// 3. Настройте маршрут Express
router.post('/list', bindingCargo(ListSample), (req, res) => {
const cargo = getCargo<ListSample>(req)
res.json(cargo)
})

export default router

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

Если вы отправите POST-запрос на /list со следующим телом JSON:

{
"stringArray": ["apple", "banana"],
"numberArray": [1, 2, 3],
"booleanArray": [true, false],
"dateArray": ["2024-01-01", "2024-01-02"],
"stringLiteralArray": ["one", "two"],
"customClassArray": [
{ "name": "John", "age": 30 },
{ "name": "Jane", "age": 25 }
]
}

Функция getCargo вернет полностью заполненный объект ListSample:

// Объект, возвращаемый getCargo<ListSample>(req):
const cargo = {
stringArray: ["apple", "banana"],
numberArray: [1, 2, 3],
booleanArray: [true, false],
dateArray: [
// Это настоящие объекты Date
new Date("2024-01-01T00:00:00.000Z"),
new Date("2024-01-02T00:00:00.000Z")
],
stringLiteralArray: ["one", "two"],
customClassArray: [
// Это экземпляры CustomClass
{ name: "John", age: 30 },
{ name: "Jane", age: 25 }
]
};