Menu
CoddyTech

Leggere il body

Fa parte della sezione Fondamenti di Express del percorso Node.js di Coddy. Lezione 15 di 23.

Una richiesta POST invia dati nel proprio corpo ed Express non legge il corpo a meno che tu non glielo chieda.

app.use(express.json());

app.post('/api/loans', (req, res) => {
    const { bookId, member } = req.body;
    res.status(201).json({ bookId, member, due: '2026-11-08' });
});

GET chiede qualcosa; POST invia qualcosa da creare. express.json() è un middleware che legge ogni corpo JSON in req.body. Senza, req.body è undefined. Una route che crea qualcosa risponde con 201 e ciò che ha creato.

Controlla il corpo prima di salvarlo. Un campo mancante è un errore del client, quindi rispondi con 400 e non salvare nulla.

challenge icon

Sfida

Facile

I visitatori possono aggiungere le proprie ricette. Un programma invia la nuova ricetta come JSON nel corpo di una richiesta POST e la tua API la salva.

  1. In server.js, aggiungi express.json() insieme alle altre righe app.use, prima delle route, in modo che un corpo JSON arrivi in req.body.
  2. Aggiungi una route per le richieste POST a /api/recipes. Legge title e tags dal corpo, ad esempio {"title": "Miso Soup", "tags": ["vegan", "soup"]}.
  3. Crea la nuova ricetta con l'id numerico successivo: le quattro ricette hanno id da 1 a 4, quindi la prima nuova ricetta avrà id 5. Mantiene il titolo e i tag che le sono stati inviati. Se non è arrivato alcun tags, usa una lista vuota, [].
  4. Aggiunge la ricetta all'array recipes, così GET /api/recipes la include nell'elenco. Poi risponde con lo stato 201 e la nuova ricetta in formato JSON: {"id": 5, "title": "Miso Soup", "tags": ["vegan", "soup"]}
  5. Quando il corpo non contiene title, non salva nulla e risponde con lo stato 400 e questo JSON: {"error": "A recipe needs a title"}

Prova: premi «Esegui». Scegli POST nel selettore del metodo, inserisci /api/recipes come percorso e metti {"title": "Miso Soup", "tags": ["vegan", "soup"]} nella casella del corpo. Dovresti vedere lo stato 201 e la ricetta con "id": 5. Scegli GET e invia /api/recipes: cinque ricette, con Miso Soup per ultima. Poi invia POST {"tags": ["dinner"]} a /api/recipes: stato 400 e {"error":"A recipe needs a title"}. GET /api/recipes continua a elencare cinque ricette.

Provalo tu

import { escapeHtml } from './html.js';
import express from 'express';
import { randomUUID } from 'node:crypto';
import { recipes } from './data.js';

const app = express();

app.use((req, res, next) => {
    console.log(`${req.method} ${req.url}`);
    next();
});

app.use((req, res, next) => {
    res.set('X-Request-Id', randomUUID());
    next();
});

app.use(express.static('public'));

app.get('/', (req, res) => {
    const items = recipes.map((r) => `<li><a href="/recipes/${r.id}">${escapeHtml(r.title)}</a></li>`);
    res.send(`<link rel="stylesheet" href="/style.css"><h1>Recipe Box</h1><ul>${items.join('')}</ul>`);
});

// type('text') invia testo semplice, quindi ogni titolo appare su una riga a sé.
app.get('/recipes', (req, res) => {
    const { tag } = req.query;
    const list = tag ? recipes.filter((recipe) => recipe.tags.includes(tag)) : recipes;
    res.type('text').send(list.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('/api/recipes', (req, res) => {
    res.json(recipes);
});

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

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

app.get('/menu', (req, res) => {
    res.redirect(301, '/recipes');
});

app.get('/menu/:id', (req, res) => {
    res.redirect(301, `/recipes/${req.params.id}`);
});

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

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti di Express

Esercitati da solo: Playground Express