Dein erstes Middleware
Teil des Abschnitts Express-Grundlagen der Node.js-Journey von Coddy. Lektion 11 von 20.
Manche Aufgaben gehören zu jeder Anfrage, etwa eine Zeile ins Protokoll zu schreiben, und sie in jede Route zu kopieren, würde nie enden.
let visits = 0;
app.use((req, res, next) => {
visits++;
next();
});Eine Funktion, die an app.use übergeben wird, ist Middleware: Express führt sie für jede Anfrage aus, und zwar in der Reihenfolge, in der sie hinzugefügt wurde, bevor die darunterliegenden Routen ausgeführt werden. Sie erhält ein drittes Argument, next. Ein Aufruf von next() gibt die Anfrage an das weiter, was als Nächstes kommt. Eine Middleware, die weder antwortet noch next() aufruft, lässt die Anfrage für immer warten.
express.static aus dem letzten Kapitel ist ebenfalls Middleware: Sie antwortet, wenn sie eine Datei findet, und ruft next() auf, wenn sie keine findet.
Aufgabe
EinfachFüge eine Middleware hinzu, die die Methode und den Pfad jeder Anfrage ausgibt, zum Beispiel GET /recipes/2.
Sende GET /recipes/2 und GET /nope und lies dann die Konsole.
Probier es selbst
import express from 'express';
import { recipes } from './data.js';
const app = express();
app.use(express.static('public'));
const escapeHtml = (text) =>
text
.replaceAll('&', '&')
.replaceAll('<', '<')
.replaceAll('>', '>')
.replaceAll('"', '"');
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') sendet reinen Text, 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('/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');
});
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Express-Grundlagen
3Middleware
Dein erstes Middleware