Menu
CoddyTech

Chaînes de requête

Fait partie de la section Les bases d’Express du Journey Node.js de Coddy. Leçon 5 sur 23.

Une page de liste a souvent besoin d’options, comme le choix des recettes à afficher, et créer une nouvelle route pour chaque option ferait trop de routes.

app.get('/books', (req, res) => {
    const { author } = req.query;
    res.send(author ? 'Books by ' + author : 'All books');
});

La chaîne de requête est la partie de l’URL qui suit ?, et Express la place dans req.query, un objet. const { author } = req.query est une forme abrégée de const author = req.query.author. GET /books?author=Austen donne req.query.author === 'Austen'. En l’absence de ?, sa valeur est undefined. Plusieurs options sont reliées par & : /books?author=Austen&year=1813.

Un paramètre de route fait partie du chemin et désigne un élément. Une option de requête sert à filtrer ou à trier une liste, et peut être omise.

challenge icon

Défi

Facile

Les visiteurs veulent voir uniquement les recettes végétaliennes, ou uniquement les plats du soir, sans avoir une nouvelle page pour chaque étiquette.

  1. Dans server.js, modifie la route /recipes. Récupère l’option tag dans la chaîne de requête. Chaque recette dans data.js possède une liste tags, comme ['vegan', 'soup'].
  2. Lorsqu’une étiquette est fournie, envoie uniquement les titres des recettes dont la liste tags la contient, un titre par ligne, comme le fait la route actuellement.
  3. Lorsqu’aucune étiquette n’est fournie, envoie tous les titres, comme avant.
  4. Lorsqu’aucune recette ne possède cette étiquette, envoie une réponse vide avec le statut 200.

Essaie : Appuie sur « Jouer » et envoie /recipes?tag=vegan. Tu devrais voir deux lignes : Tomato Soup et Lentil Curry. Envoie /recipes?tag=dinner : Lentil Curry et Fish & Chips. Envoie /recipes?tag=dessert : une réponse vide, puisqu’aucune recette ne possède cette étiquette. Envoie /recipes : les quatre titres.

Essayez vous-même

import express from 'express';
import { recipes } from './data.js';

const app = express();

app.get('/', (req, res) => {
    res.send('Welcome to Recipe Box');
});

// type('text') envoie du texte brut, chaque titre s’affiche donc sur sa propre ligne.
app.get('/recipes', (req, res) => {
    res.type('text').send(recipes.map((recipe) => recipe.title).join('\n'));
});

app.get('/recipes/:id', (req, res) => {
    const recipe = recipes.find((r) => r.id === Number(req.params.id));
    if (!recipe) {
        res.status(404).send('No such recipe');
        return;
    }
    res.send(recipe.title);
});

app.get('/about', (req, res) => {
    res.send('Recipe Box collects family recipes.');
});

app.listen(3000, () => {
    console.log('Recipe Box is running on port 3000');
});

Toutes les leçons de Les bases d’Express

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