Middleware Pertamamu
Termasuk bagian Dasar-Dasar Express dalam perjalanan Node.js di Coddy. Pelajaran 11 dari 20.
Beberapa pekerjaan berlaku untuk setiap permintaan, seperti menulis satu baris ke log, dan menyalinnya ke setiap route tidak akan ada habisnya.
let visits = 0;
app.use((req, res, next) => {
visits++;
next();
});Fungsi yang diberikan ke app.use disebut middleware: Express menjalankannya untuk setiap permintaan, sesuai urutan penambahannya, sebelum route di bawahnya. Fungsi ini menerima argumen ketiga, yaitu next. Memanggil next() meneruskan permintaan ke proses berikutnya. Middleware yang tidak memberikan jawaban dan tidak memanggil next() akan membuat permintaan menunggu selamanya.
express.static dari bab sebelumnya juga merupakan middleware: middleware ini memberikan jawaban saat menemukan file dan memanggil next() saat tidak menemukannya.
Tantangan
MudahTambahkan middleware yang mencetak method dan path setiap request, seperti GET /recipes/2.
Kirim GET /recipes/2 dan GET /nope, lalu baca Console.
Coba sendiri
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') mengirim teks biasa, sehingga setiap judul muncul di baris tersendiri.
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');
});
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Dasar-Dasar Express
Latihan sendiri: Playground Express