Menu
CoddyTech

İ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.

challenge icon

Görev

Kolay

Sunucunuzun aldığı her istek için bir günlük satırı görmek, böylece ziyaretçilerin ne istediğini anlayabilmek istiyorsunuz.

  1. server.js dosyasında, const app = express(); satırının hemen sonrasına app.use ile bir ara yazılım ekleyin. Buraya yerleştirildiğinde, her rotadan önce çalışır.
  2. Her istek için Konsola bir satır yazdırır: isteğin yöntemi, bir boşluk ve ardından yolu. /recipes/2 isteği GET /recipes/2 yazdırır. Yöntem req.method içinde (GET, POST vb.), yol ise req.url içindedir.
  3. 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');
});
quiz iconKendini test et

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