Menu
CoddyTech

Ciągi zapytania

Część sekcji Podstawy Express ścieżki Node.js w Coddy. Lekcja 5 z 23.

Strona z listą często potrzebuje opcji, na przykład określającej, które przepisy wyświetlić, a tworzenie osobnej trasy dla każdej opcji byłoby przesadą.

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

Ciąg zapytania to część adresu URL po ?, a Express umieszcza go w obiekcie req.query. const { author } = req.query to skrócona forma zapisu const author = req.query.author. GET /books?author=Austen daje req.query.author === 'Austen'. Gdy nie ma ?, wartość to undefined. Kilka opcji łączy się za pomocą &: /books?author=Austen&year=1813.

Parametr trasy jest częścią ścieżki i wskazuje jedną rzecz. Opcja zapytania filtruje lub sortuje listę i można ją pominąć.

challenge icon

Wyzwanie

Łatwy

Odwiedzający chcą widzieć tylko wegańskie przepisy albo tylko dania obiadowe, bez tworzenia nowej strony dla każdego tagu.

  1. W pliku server.js zmień trasę /recipes. Odczytaj opcję tag z ciągu zapytania. Każdy przepis w pliku data.js ma listę tags, na przykład ['vegan', 'soup'].
  2. Gdy podano tag, wyślij tylko tytuły przepisów, których lista tags go zawiera — po jednym tytule w każdym wierszu, tak jak robi to obecnie ta trasa.
  3. Gdy nie podano tagu, wyślij wszystkie tytuły, tak jak wcześniej.
  4. Gdy żaden przepis nie ma tego tagu, wyślij pustą odpowiedź ze statusem 200.

Wypróbuj: Naciśnij „Uruchom” i wyślij /recipes?tag=vegan. Powinny pojawić się dwa wiersze: Tomato Soup i Lentil Curry. Wyślij /recipes?tag=dinner: Lentil Curry i Fish & Chips. Wyślij /recipes?tag=dessert: pusta odpowiedź, ponieważ żaden przepis nie ma tego tagu. Wyślij /recipes: wszystkie cztery tytuły.

Spróbuj swoich sił

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

const app = express();

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

// type('text') wysyła zwykły tekst, więc każdy tytuł pojawia się w osobnym wierszu.
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');
});

Wszystkie lekcje w sekcji Podstawy Express

Poćwicz samodzielnie: Edytor online Express