Aller au contenu principal

Gestion des requêtes imbriquées

Cet exemple montre comment Express-Cargo peut remplir des requêtes imbriquées, vous permettant de mapper des données de requête complexes et structurées en un seul objet bien organisé.

1. Définir vos requêtes​

Dans ce scénario, nous allons définir deux classes : UserInfoRequest et OrderRequest. La classe UserInfoRequest extrait les détails de l'utilisateur du corps de la requête et un jeton d'authentification des en-têtes.

UserInfoRequest – Mappe les détails de l'utilisateur depuis le corps de la requête et extrait le jeton d'autorisation des en-têtes.

// 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

// Extraire le jeton de l'en-tête Authorization.
@Header('authorization')
@Transform((value: string) => {
if (value.startsWith('Bearer ')) {
return value.substring(7);
}
return ''
})
authorization!: string
}

OrderRequest – Représente une requête de commande, incluant une UserInfoRequest imbriquée.

// 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
}

Dans UserInfoRequest, nous utilisons le décorateur @Header sur la propriété authorization pour obtenir la valeur de l'en-tête Authorization. Ensuite, le décorateur @Transform extrait juste la valeur du jeton, en supprimant le préfixe "Bearer ".

2. Utiliser dans une route Express​

Appliquez simplement le middleware bindingCargo à votre route avec la requête de niveau supérieur, OrderRequest. Le middleware gérera toute la logique de liaison pour vous.

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

if (order) {
console.log(`Traitement de la commande pour le produit : ${order.productId}`)
console.log(`Nom de l'utilisateur : ${order.user.name}`)
console.log(`Jeton d'authentification : ${order.user.authorization}`)

// Vous pouvez maintenant utiliser le jeton d'authentification pour la validation ou d'autres logiques.
res.json({ message: 'Commande reçue', order })
}
})

3. Exemple de requête​

Cette route traitera avec succès une requête qui a à la fois un corps et un en-tête Authorization.

  • Corps de la requête :

    {
    "productId": "SKU-456",
    "quantity": 5,
    "user": {
    "name": "Jeanne Dupont",
    "email": "user-jeanne@example.com"
    }
    }
  • En-têtes de la requête :

    Authorization: Bearer mon-jeton-auth-12345

Lors du traitement, getCargo(req) retournera un seul objet OrderRequest qui contient toutes les données, avec la propriété authorization correctement remplie depuis l'en-tête. Cela démontre comment Express-Cargo unifie élégamment plusieurs sources de données en un seul objet propre.

4. Exemple de résultat​

Objet OrderRequest lié final :

{
"productId": "SKU-456",
"quantity": 5,
"user": {
"name": "Jeanne Dupont",
"email": "user-jeanne@example.com",
"authorization": "mon-jeton-auth-12345"
}
}