Menu
CoddyTech

JSON-Antworten

Teil des Abschnitts Express-Grundlagen der Node.js-Journey von Coddy. Lektion 6 von 23.

Ein Programm, das deinen Server aufruft, benötigt Daten, die es lesen kann, keinen Satz.

app.get('/api/weather', (req, res) => {
    res.json({ city: 'Oslo', temp: 4, rain: true });
});

JSON ist ein Textformat für Objekte und Arrays. res.json(value) wandelt den Wert in JSON um und setzt den Content-Type-Header auf application/json; ein Header ist eine benannte Zeile, die mit der Antwort gesendet wird, und dieser gibt an, welche Art von Inhalt folgt. Der Client erhält {"city":"Oslo","temp":4,"rain":true} und liest temp als Zahl aus.

res.send mit einer Zeichenfolge sendet text/html, das ein Programm erst zerlegen müsste. Routen für Programme beginnen normalerweise mit /api, damit Seiten und Daten niemals denselben Pfad verwenden.

challenge icon

Aufgabe

Einfach

Programme, etwa eine Smartphone-App, benötigen die Daten von Recipe Box in einem Format, das sie lesen können. Füge neben den Seiten eine JSON-API hinzu.

  1. Füge in server.js eine Route für /api/recipes hinzu. Sie sendet das gesamte recipes-Array als JSON.
  2. Füge eine Route für /api/recipes/:id hinzu. Sie sucht das Rezept so, wie es /recipes/:id tut, und sendet das gesamte Rezeptobjekt als JSON, nicht nur dessen Titel. Für Rezept 2 ist das das Objekt mit "id": 2, "title": "Pancakes", "tags": ["breakfast", "sweet"] und seinen Portionen.
  3. Wenn kein Rezept diese ID hat, antworte mit dem Status 404. Du kannst den Text No such recipe senden, wie es die Seite tut.

Probiere es aus: Drücke auf „Ausführen“ und sende /api/recipes. Du solltest eine Liste mit vier Rezepten sehen, beginnend mit Tomato Soup. Sende /api/recipes/2: das Pancakes-Objekt. Sende /api/recipes/99: Status 404. Im Tab „Headers“ hat /api/recipes den Content-Type application/json. Sende dann /about: Sein Content-Type ist text/html, weil res.send mit einem String eine Seite sendet.

Probier es selbst

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

const app = express();

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

// type('text') sendet Klartext, sodass jeder Titel in einer eigenen Zeile erscheint.
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('/about', (req, res) => {
    res.send('Recipe Box collects family recipes.');
});

app.listen(3000, () => {
    console.log('Recipe Box is running on port 3000');
});
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Express-Grundlagen

Übe selbstständig: Express-Playground