Odczytywanie treści
Część sekcji Podstawy Express ścieżki Node.js w Coddy. Lekcja 15 z 23.
Żądanie POST wysyła dane w swoim ciele, a Express go nie odczytuje, dopóki mu na to nie pozwolisz.
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 prosi o coś, a POST wysyła coś do utworzenia. express.json() to oprogramowanie pośredniczące, które odczytuje każde ciało JSON do req.body. Bez niego req.body ma wartość undefined. Trasa, która coś tworzy, odpowiada kodem 201 i zwraca to, co utworzyła.
Sprawdź ciało żądania, zanim je zapiszesz. Brakujące pole to błąd klienta, więc odpowiedz kodem 400 i niczego nie zapisuj.
Wyzwanie
ŁatwyOdwiedzający mogą dodawać własne przepisy. Program wysyła nowy przepis jako JSON w treści żądania POST, a Twoje API go zapisuje.
- W pliku
server.jsdodajexpress.json()razem z pozostałymi wierszamiapp.use, przed trasami, aby treść żądania w formacie JSON trafiała doreq.body. - Dodaj trasę obsługującą żądania POST do
/api/recipes. Odczytuje onatitleitagsz treści żądania, na przykład{"title": "Miso Soup", "tags": ["vegan", "soup"]}. - Tworzy nowy przepis z kolejnym numerem id: cztery przepisy mają identyfikatory od 1 do 4, więc pierwszy nowy przepis otrzyma 5. Zachowuje przesłane wartości title i tags. Jeśli nie przesłano
tags, użyj pustej listy[]. - Dodaje przepis do tablicy
recipes, aby żądanieGET /api/recipesgo wyświetlało. Następnie odpowiada statusem 201 i nowym przepisem w formacie JSON:{"id": 5, "title": "Miso Soup", "tags": ["vegan", "soup"]} - Jeśli treść żądania nie zawiera
title, niczego nie zapisuje i odpowiada statusem 400 oraz tym obiektem JSON:{"error": "A recipe needs a title"}
Wypróbuj: Naciśnij Uruchom. Wybierz POST w selektorze metody, wpisz /api/recipes jako ścieżkę i umieść {"title": "Miso Soup", "tags": ["vegan", "soup"]} w polu treści żądania. Powinien pojawić się status 201 i przepis z wartością "id": 5. Wybierz GET i wyślij żądanie do /api/recipes: zobaczysz pięć przepisów, a Miso Soup będzie na końcu. Następnie wyślij żądanie POST z treścią {"tags": ["dinner"]} do /api/recipes: otrzymasz status 400 i {"error":"A recipe needs a title"}. Żądanie GET /api/recipes nadal wyświetla pięć przepisów.
Spróbuj swoich sił
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') wysyła zwykły tekst, więc każdy tytuł pojawia się w osobnym wierszu.
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');
});
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy Express
Poćwicz samodzielnie: Edytor online Express