Menu
CoddyTech

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');
challenge icon

Défi

Facile

Votre 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" } }
  1. Dans errors.js, terminez sendError(res, status, code, message, fields). Cette fonction répond avec le statut fourni et la forme ci-dessus. Ajoutez fields à l’objet interne uniquement si cet argument a été fourni. sendInvalid, juste en dessous, est déjà écrit et appelle votre fonction.
  2. 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 code not_found et le message Task 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"] }
      }
    }
  3. Dans server.js, importez sendError et 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_json et le message The body is not valid JSON.
    • Tout le reste reçoit le statut 500, le code server_error et le message Something went wrong.

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);
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Playground Express