Obtenir de la donnée d’une requête
Dans cette section, nous allons voir comment obtenir de la donnée typée d’une requête, de manière robuste et 100% fiable. Tous les exemples présentés dans ce cours sont disponibles en entier ici.
La methode extract
La methode extract fait partie du builder de l’objet Route. Elle a pour effet direct d’ajouter une ExtractStep aux étapes de la route en cours de création. Le but d’une étape ExtractStep est de récupérer des données provenant de la requête courante. Pour cela, Duplo utilise la librairie de parsing zod, qui garantit la validité du type des données et enrichit le floor. L’objet Resquest étant inaccecible directement, la méthode extract sera la seule passerelle vers celui-ci.
import { CreatedHttpResponse, useBuilder, zod } from "@duplojs/core";
useBuilder()
.createRoute("POST", "/user")
.extract({
body: zod.object({
userName: zod.string(),
email: zod.string(),
age: zod.number(),
}),
})
.handler(
(pickup) => {
const { userName, email, age } = pickup("body");
const user = {
id: 1,
userName,
email,
age,
};
return new CreatedHttpResponse(
"user.created",
user,
);
},
);
Dans cet exemple :
- La methode
extractest utilisée avant la methodehandlerdonc l’exécution de l’étapeExtractStepse fait avant celle deHandlerStep.extractprend en premier argument un objet ayant les mêmes clés que l’objetRequest.- Le schéma
zoddéfini pour la clébodyde l’objet sera appliqué à la valeur contenue dansRequest.body.- La clé
bodyest ajoutée auflooret aura le type défini par le schémazod.- En cas d’échec du parsing, la route renverra une réponse d’erreur et l’exécution s’arrêtera à l’étape
ExtractStep. Toutes les étapes déclarées derrière ne seront donc pas éxécutées.
Niveau d’extraction de la donnée
Il existe deux niveaux d’extraction : simple ou profond.
import { OkHttpResponse, useBuilder, zod } from "@duplojs/core";
useBuilder()
.createRoute("GET", "/user/{userId}")
.extract({
params: zod.object({
userId: zod.string(),
}),
})
.handler(
(pickup) => {
const params = pickup("params");
console.log(params.userId);
return new OkHttpResponse(
"user",
undefined,
);
},
);
Dans cet exemple :
- L’extraction est faite à un niveau simple.
- La clé
paramssera ajoutée auflooret aura le type défini par le schémazod.
import { OkHttpResponse, useBuilder, zod } from "@duplojs/core";
useBuilder()
.createRoute("GET", "/user/{userId}")
.extract({
params: {
userId: zod.string(),
},
})
.handler(
(pickup) => {
const userId = pickup("userId");
console.log(userId);
return new OkHttpResponse(
"user",
undefined,
);
},
);
Dans cet exemple :
- L’extraction est faite à un niveau profond.
- La clé
userIdsera ajoutée auflooret aura le type défini par le schémazod.
Gestion des échecs
En cas d’échec d’exécution d’une étape ExtractStep causé par l’invalidité d’une donnée, une réponse UnprocessableEntityHttpResponse sera renvoyée. Il est possible de modifier ce comportement par défaut en passant un callbac en deuxième argument de extract.
import { OkHttpResponse, InternalServerErrorHttpResponse, useBuilder, zod } from "@duplojs/core";
useBuilder()
.createRoute("GET", "/user/{userId}")
.extract(
{
params: {
userId: zod.string(),
},
},
(type, key, zodError) => new InternalServerErrorHttpResponse(
"error",
zodError,
),
)
.handler(
(pickup) => {
const userId = pickup("userId");
console.log(userId);
return new OkHttpResponse(
"user.get",
undefined,
);
},
);
Dans cet exemple :
- En cas d’échec du parsing de
userId, uneInternalServerErrorHttpResponsesera renvoyée.- La clé
userIdsera ajoutée auflooret aura le type défini par le schémazod.
Gestion des échecs global
Il est possible de changer le comportement par défaut des échecs pour toutes les étapes ExtractStep en utilisant setExtractError d’une instance Duplo. Cela s’applique à toutes les routes enregistrées dans cette instance.
import { UnprocessableEntityHttpResponse, Duplo } from "@duplojs/core";
const duplo = new Duplo({ environment: "TEST" });
duplo.setExtractError(
(type, key, zodError) => new UnprocessableEntityHttpResponse(
"error.extract",
zodError,
),
);
Dans cet exemple :
new Duploinitialise l’application avec un environnement de test.- Toutes les routes créées avec
useBuildersont enregistrées dans l’instance.- La methode
setExtractErrordéfinit le comportement par défaut en cas d’échec des étapesExtractStepavec le renvoi d’uneUnprocessableEntityHttpResponse.