Menu
CoddyTech

Cadenas de consulta

Parte de la sección Conceptos básicos de Express del Journey de Node.js de Coddy. Lección 5 de 23.

Una página de lista suele necesitar opciones, como qué recetas mostrar, y crear una ruta nueva para cada opción sería demasiado.

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

La cadena de consulta es la parte de la URL que va después de ?, y Express la coloca en req.query, un objeto. const { author } = req.query es una forma abreviada de const author = req.query.author. GET /books?author=Austen da como resultado req.query.author === 'Austen'. Si no hay ?, su valor es undefined. Se pueden combinar varias opciones con &: /books?author=Austen&year=1813.

Un parámetro de ruta forma parte de la ruta y nombra una cosa. Una opción de consulta filtra u ordena una lista, y se puede omitir.

challenge icon

Desafío

Fácil

Los visitantes quieren ver solo recetas veganas o solo cenas, sin una página nueva para cada etiqueta.

  1. En server.js, modifica la ruta /recipes. Lee la opción tag de la cadena de consulta. Cada receta en data.js tiene una lista de tags, como ['vegan', 'soup'].
  2. Cuando se proporciona una etiqueta, envía solo los títulos de las recetas que la incluyen en tags, un título por línea, como hace ahora la ruta.
  3. Cuando no se proporciona ninguna etiqueta, envía todos los títulos, como antes.
  4. Cuando ninguna receta tenga esa etiqueta, envía una respuesta vacía con el estado 200.

Pruébalo: Pulsa Ejecutar y envía /recipes?tag=vegan. Deberías ver dos líneas: Tomato Soup y Lentil Curry. Envía /recipes?tag=dinner: Lentil Curry y Fish & Chips. Envía /recipes?tag=dessert: una respuesta vacía, ya que ninguna receta tiene esa etiqueta. Envía /recipes: los cuatro títulos.

Pruébalo tú mismo

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

const app = express();

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

// type('text') envía texto sin formato, por lo que cada título aparece en su propia línea.
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');
});

Todas las lecciones de Conceptos básicos de Express

Practica por tu cuenta: Playground de Express