İlk Ara Katmanınız
Coddy'nin Node.js Journey'sinin Express Temelleri bölümünün bir parçası. Ders 13 / 23.
Günlük kaydına bir satır yazmak gibi bazı işler her istek için yapılır; bunları her rotaya eklemek hiç bitmez. Her isteğin req.method içinde bir yöntemi vardır: bir şeyi almak için GET, bir şey göndermek için POST.
let visits = 0;
app.use((req, res, next) => {
visits++;
next();
});app.use işlevine verilen bir işlev ara yazılımdır: Express bu işlevi her istek için, eklendiği sırayla ve altındaki rotalardan önce çalıştırır. Bu işlev üçüncü bir bağımsız değişken alır: next. next() çağrısı, isteği sıradaki öğeye aktarır. Ne yanıt veren ne de next() çağıran bir ara yazılım, isteği sonsuza kadar beklemede bırakır.
Önceki bölümdeki express.static de ara yazılımdır: bir dosya bulduğunda yanıt verir, bulamadığında ise next() çağırır.
Görev
KolaySunucunuzun aldığı her istek için bir günlük satırı görmek, böylece ziyaretçilerin ne istediğini anlayabilmek istiyorsunuz.
server.jsdosyasında,const app = express();satırının hemen sonrasınaapp.useile bir ara yazılım ekleyin. Buraya yerleştirildiğinde, her rotadan önce çalışır.- Her istek için Konsola bir satır yazdırır: isteğin yöntemi, bir boşluk ve ardından yolu.
/recipes/2isteğiGET /recipes/2yazdırır. Yöntemreq.methodiçinde (GET,POSTvb.), yol isereq.urliçindedir. - Yazdırdıktan sonra
next()çağrılır; böylece istek rotalara devam eder.
Deneyin: “Oyna”ya basın ve /recipes/2 gönderin. Pancakes görmelisiniz; Konsolda da GET /recipes/2 görünür. /api/recipes gönderin: liste her zamanki gibi görünür ve Konsolda GET /api/recipes görünür. /nope gönderin: 404 yanıtı alırsınız; ara yazılım Express bir rota aramadan önce çalıştığı için Konsolda yine GET /nope görünür.
Kendin dene
import { escapeHtml } from './html.js';
import express from 'express';
import { recipes } from './data.js';
const app = express();
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') düz metin gönderir, bu nedenle her başlık kendi satırında görünür.
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');
});
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Express Temelleri bölümündeki tüm dersler
Kendi başına pratik yap: Express playground