Une structure d’erreur unique
Fait partie de la section API REST du Journey Node.js de Coddy. Leçon 12 sur 25.
Votre API renvoie désormais les erreurs sous deux formes : une chaîne pour une 404 et l’objet de zod pour une 400. Un client doit gérer chacune d’elles. Choisissez une seule forme pour toutes les erreurs :
{ "error": { "code": "not_found", "message": "Invoice not found" } }
{ "error": { "code": "invalid_body", "message": "Too small: ...",
"fields": { "amount": ["Too small: expected number to be >0"] } } }code est destiné aux programmes : il ne change jamais, ce qui permet à un client de le comparer. message est destiné aux personnes, et sa formulation peut changer. fields indique à un formulaire quel champ marquer. Définissez cette forme dans une seule fonction et appelez-la depuis chaque route, afin qu’aucune route ne puisse s’en écarter :
sendError(res, 404, 'not_found', 'Invoice not found');Défi
FacileVotre API envoie désormais les erreurs sous deux formes : une simple chaîne pour un 404, et un objet zod pour un 400. Donnez à chaque erreur la même forme, afin qu’un client puisse toutes les lire de la même manière. Désormais, chaque erreur ressemble à ceci, avec fields ajouté uniquement s’il y a quelque chose à énumérer :
{ "error": { "code": "not_found", "message": "Task not found" } }- Dans
errors.js, terminezsendError(res, status, code, message, fields). Cette fonction répond avec le statut fourni et la forme ci-dessus. Ajoutezfieldsà l’objet interne uniquement si cet argument a été fourni.sendInvalid, juste en dessous, est déjà écrit et appelle votre fonction. - Dans
routes/tasks.js, importez les deux fonctions utilitaires :- Remplacez les quatre réponses 404 (GET, PATCH, PUT et DELETE pour une tâche) par
sendError, en utilisant le codenot_foundet le messageTask not found. - Remplacez les trois réponses 400 pour un corps de requête incorrect (POST, PATCH et PUT) par
sendInvalid(res, result.error).
Un corps de requête incorrect ressemble alors à ceci (zod rédige le message) :
{ "error": { "code": "invalid_body", "message": "Invalid input: expected string, received number", "fields": { "title": ["Invalid input: expected string, received number"] } } } - Remplacez les quatre réponses 404 (GET, PATCH, PUT et DELETE pour une tâche) par
- Dans
server.js, importezsendErroret utilisez-le dans le gestionnaire d’erreurs en bas du fichier :- Un corps de requête qui n’est pas un JSON valide reçoit le statut 400, le code
invalid_jsonet le messageThe body is not valid JSON. - Tout le reste reçoit le statut 500, le code
server_erroret le messageSomething went wrong.
- Un corps de requête qui n’est pas un JSON valide reçoit le statut 400, le code
Essayez : DELETE /api/tasks/99 renvoie 404 avec { "error": { "code": "not_found", "message": "Task not found" } }, sans fields. Envoyez { "title": 123 } en POST à /api/tasks : vous obtenez un 400 avec l’erreur invalid_body ci-dessus. La barre de requête refuse d’envoyer du JSON incorrect ; les vérifications testent donc le cas invalid_json à votre place.
Essayez vous-même
import { z } from 'zod';
// Envoie toutes les erreurs sous une même forme :
// { "error": { "code": "not_found", "message": "Task not found" } }
// avec "fields" ajouté uniquement lorsqu’il est fourni.
export const sendError = (res, status, code, message, fields) => {
// Envoyez la réponse ici
};
// Une erreur zod sous forme de 400 : son premier problème comme message, les problèmes de chaque champ
// dans fields.
export const sendInvalid = (res, zodError) =>
sendError(res, 400, 'invalid_body', zodError.issues[0].message, z.flattenError(zodError).fieldErrors);
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de API REST
1Ressources et verbes
Ressources et URLCréer avec POST4Navigateurs, versions et configuration
Qu’est-ce qu’une origineAutoriser une autre origineCORSUne page qui appelle l’API2Validation et erreurs
Valider les entréesEntraînez-vous par vous-même : Playground Express