Zum Hauptinhalt springen

Behandlung von verschachtelten Anfragen

Dieses Beispiel zeigt, wie Express-Cargo verschachtelte Anfragen füllen kann, sodass Sie komplexe, strukturierte Anfragedaten in einem einzigen, gut organisierten Objekt abbilden können.

1. Definieren Sie Ihre Anfragen

In diesem Szenario definieren wir zwei Klassen: UserInfoRequest und OrderRequest. Die UserInfoRequest-Klasse ruft Benutzerdetails aus dem Anfrage-Body und ein Authentifizierungstoken aus den Headern ab.

UserInfoRequest – Mappt Benutzerdetails aus dem Anfrage-Body und extrahiert das Autorisierungstoken aus den Headern.

// user.request.ts
import { Body, Header, Optional, Prefix, Transform } from 'express-cargo'

export class UserInfoRequest {
@Body('name')
name!: string

@Body('email')
@Prefix('user-')
email!: string

@Body('age')
@Optional()
age?: number

// Extrahiert das Token aus dem Authorization-Header.
@Header('authorization')
@Transform((value: string) => {
if (value.startsWith('Bearer ')) {
return value.substring(7);
}
return ''
})
authorization!: string
}

OrderRequest – Repräsentiert eine Bestellanfrage, einschließlich einer verschachtelten UserInfoRequest.

// order.request.ts
import { Body, Min, Max } from 'express-cargo'
import { UserInfoRequest } from './user.request'

export class OrderRequest {
@Body('productId')
productId!: string

@Body('quantity')
@Min(1)
@Max(10)
quantity!: number

@Body('user')
user!: UserInfoRequest
}

In UserInfoRequest verwenden wir den @header-Decorator für die authorization-Eigenschaft, um den Wert aus dem Authorization-Header zu erhalten. Dann extrahiert der @transform-Decorator nur den Token-Wert und entfernt das Präfix "Bearer ".

2. Verwendung in einer Express-Route

Wenden Sie einfach die bindingCargo-Middleware auf Ihre Route mit der übergeordneten Anfrage, OrderRequest, an. Die Middleware übernimmt die gesamte Bindungslogik für Sie.

router.post('/orders', bindingCargo(OrderRequest), (req, res) => {
const order = getCargo<OrderRequest>(req)

if (order) {
console.log(`Verarbeite Bestellung für Produkt: ${order.productId}`)
console.log(`Benutzername: ${order.user.name}`)
console.log(`Auth-Token: ${order.user.authorization}`)

// Sie können das Auth-Token jetzt für die Validierung oder andere Logik verwenden.
res.json({ message: 'Bestellung erhalten', order })
}
})

3. Beispielanfrage

Diese Route verarbeitet erfolgreich eine Anfrage, die sowohl einen Body als auch einen Authorization-Header hat.

  • Anfrage-Body:

    {
    "productId": "SKU-456",
    "quantity": 5,
    "user": {
    "name": "Jane Doe",
    "email": "user-jane@example.com"
    }
    }
  • Anfrage-Header:

    Authorization: Bearer my-auth-token-12345

Bei der Verarbeitung gibt getCargo(req) ein einzelnes OrderRequest-Objekt zurück, das alle Daten enthält, wobei die authorization-Eigenschaft korrekt aus dem Header gefüllt ist. Dies zeigt, wie Express-Cargo elegant mehrere Datenquellen in einem sauberen Objekt vereint.

4. Beispielergebnis

Final gebundenes OrderRequest-Objekt:

{
"productId": "SKU-456",
"quantity": 5,
"user": {
"name": "Jane Doe",
"email": "user-jane@example.com",
"authorization": "my-auth-token-12345"
}
}