Twoje pierwsze middleware
Część sekcji Podstawy Express ścieżki Node.js w Coddy. Lekcja 11 z 20.
Niektóre czynności dotyczą każdego żądania, na przykład zapisywanie wiersza w dzienniku, a kopiowanie tego do każdej trasy nigdy by się nie skończyło.
let visits = 0;
app.use((req, res, next) => {
visits++;
next();
});Funkcja przekazana do app.use to oprogramowanie pośredniczące: Express uruchamia ją dla każdego żądania, w kolejności dodania, przed trasami znajdującymi się poniżej. Otrzymuje trzeci argument, next. Wywołanie next() przekazuje żądanie dalej, do kolejnego elementu. Oprogramowanie pośredniczące, które ani nie odpowiada, ani nie wywołuje next(), sprawia, że żądanie czeka w nieskończoność.
express.static z poprzedniego rozdziału również jest oprogramowaniem pośredniczącym: odpowiada, gdy znajdzie plik, i wywołuje next(), gdy go nie znajdzie.
Wyzwanie
ŁatwyDodaj oprogramowanie pośredniczące, które wypisuje metodę i ścieżkę każdego żądania, na przykład GET /recipes/2.
Wyślij żądania GET /recipes/2 i GET /nope, a następnie sprawdź konsolę.
Spróbuj swoich sił
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') 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
3Middleware
Twoje pierwsze middleware