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.
Défi
Facile- POST :
titledoit être une chaîne de 1 à 100 caractères, ne contenant pas uniquement des espaces, sinon renvoyer 400 avec uneerrormentionnanttitle. - PATCH : même règle pour
titlelorsqu’il est envoyé, etdone, lorsqu’il est envoyé, doit êtretrueoufalse.
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;
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.