Menu
CoddyTech

Valider les entrées

Fait partie de la section API REST du Journey Node.js de Coddy. Leçon 6 sur 18.

Un client peut envoyer n’importe quoi dans le corps de la requête, et if (!name) ne bloque que les valeurs vides. 123, true et ["x"] sont des valeurs truthy et passent, et une chaîne composée d’espaces semble correcte. Vérifie le type de chaque champ avec typeof, puis ses limites :

const { seats } = req.body ?? {};
if (typeof seats !== 'number' || !Number.isInteger(seats) || seats < 1) {
    return res.status(400).json({ error: 'seats must be a whole number from 1' });
}

Rédige le message à l’intention de la personne qui lit la réponse : nomme le champ et indique ce qu’il doit être pour qu’elle sache quoi corriger. Une requête PATCH vérifie uniquement les champs qui lui ont été envoyés, puisque les autres ne changent pas.

challenge icon

Défi

Facile
  • POST : title doit être une chaîne de 1 à 100 caractères, ne contenant pas uniquement des espaces, sinon renvoyer 400 avec une error mentionnant title.
  • PATCH : même règle pour title lorsqu’il est envoyé, et done, lorsqu’il est envoyé, doit être true ou false.

Envoyez une requête POST avec { "title": 123 }, puis une requête PATCH /api/tasks/2 avec { "done": "yes" }.

Essayez vous-même

import { Router } from 'express';
import { nextId, tasks } from '../store.js';

const router = Router();

router.get('/', (req, res) => {
    res.json(tasks);
});

router.get('/:id', (req, res) => {
    const task = tasks.find((t) => t.id === Number(req.params.id));
    if (!task) {
        return res.status(404).json({ error: 'Task not found' });
    }
    res.json(task);
});

router.post('/', (req, res) => {
    const { title } = req.body ?? {};
    if (!title) {
        return res.status(400).json({ error: 'title is required' });
    }
    const task = { id: nextId(), title, done: false, createdAt: new Date().toISOString() };
    tasks.push(task);
    res.status(201).location(`/api/tasks/${task.id}`).json(task);
});

router.patch('/:id', (req, res) => {
    const task = tasks.find((t) => t.id === Number(req.params.id));
    if (!task) {
        return res.status(404).json({ error: 'Task not found' });
    }
    const { title, done } = req.body ?? {};
    if (title !== undefined) task.title = title;
    if (done !== undefined) task.done = done;
    res.json(task);
});

router.put('/:id', (req, res) => {
    const index = tasks.findIndex((t) => t.id === Number(req.params.id));
    if (index === -1) {
        return res.status(404).json({ error: 'Task not found' });
    }
    const { title, done } = req.body ?? {};
    if (title === undefined || done === undefined) {
        return res.status(400).json({ error: 'PUT needs every field: title and done' });
    }
    const { id, createdAt } = tasks[index];
    tasks[index] = { id, title, done, createdAt };
    res.json(tasks[index]);
});

router.delete('/:id', (req, res) => {
    const index = tasks.findIndex((t) => t.id === Number(req.params.id));
    if (index === -1) {
        return res.status(404).json({ error: 'Task not found' });
    }
    tasks.splice(index, 1);
    res.status(204).end();
});

export default router;
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