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.
Défi
FacileLes visiteurs veulent voir uniquement les recettes végétaliennes, ou uniquement les plats du soir, sans avoir une nouvelle page pour chaque étiquette.
- Dans
server.js, modifie la route/recipes. Récupère l’optiontagdans la chaîne de requête. Chaque recette dansdata.jspossède une listetags, comme['vegan', 'soup']. - Lorsqu’une étiquette est fournie, envoie uniquement les titres des recettes dont la liste
tagsla contient, un titre par ligne, comme le fait la route actuellement. - Lorsqu’aucune étiquette n’est fournie, envoie tous les titres, comme avant.
- 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
1Votre premier serveur
Bonjour, ExpressLe module httpPlus de routesParamètres de routeEntraînez-vous par vous-même : Playground Express