Virtuelle Feld-Decorators
Express-Cargo bietet Decorators zur Definition von virtuellen Feldern und anfragebasierten Feldern. Diese Decorators ermöglichen es Ihnen, Werte dynamisch zu berechnen oder Daten aus dem Request-Objekt direkt in die Objekteigenschaft abzubilden.
Integrierte virtuelle Decorators
@Virtual<T>(transformer: (obj: object) => T)
Der @Virtual-Decorator definiert eine berechnete Eigenschaft, die nicht direkt aus der Anfrage stammt. Stattdessen wird ihr Wert aus anderen Eigenschaften des Objekts abgeleitet.
transformer: Eine Funktion, die die Objektinstanz empfängt und den berechneten Wert zurückgibt.
@Request<T>(transformer: (req: Request) => T)
Der @Request-Decorator bildet einen Wert aus dem Express Request-Objekt in eine Klasseneigenschaft ab.
transformer: Eine Funktion, die das Request-Objekt empfängt und den zu bindenden Wert zurückgibt.
Anwendungsbeispiel
import express from 'express'
import { Body, Virtual, Request, bindingCargo, getCargo } from 'express-cargo'
// 1. Definieren Sie ein Objekt mit virtuellen und anfragebasierten Feldern
class OrderExample {
@Body('price')
price!: number
@Body('quantity')
quantity!: number
// Berechnetes Feld, das nicht in der Anfrage vorhanden ist
@Virtual((obj: OrderExample) => obj.price * obj.quantity)
total!: number
}
class HeaderExample {
// Feld, das direkt vom Request-Objekt abgeleitet wird
@Request(req => req.headers['x-custom-header'] as string)
customHeader!: string
}
// 2. Express-App und Route einrichten
const app = express()
app.use(express.json())
app.post('/orders', bindingCargo(OrderExample), (req, res) => {
const orderData = getCargo<OrderExample>(req)
res.json({
message: 'Bestelldaten mit virtuellen Feldern verarbeitet!',
data: orderData
})
})
app.post('/headers', bindingCargo(HeaderExample), (req, res) => {
const headerData = getCargo<HeaderExample>(req)
res.json({
message: 'Header-Daten mit @request abgebildet!',
data: headerData
})
})
/*
Um diese Endpunkte zu testen, senden Sie POST-Anfragen mit dem entsprechenden Body oder den Headern:
Beispiel /orders Body:
{
"price": 50,
"quantity": 2
}
Beispiel /headers Header:
x-custom-header: my-header-value
*/