Menu
CoddyTech

İstek Gövdesini Okuma

Coddy'nin Node.js Journey'sinin Express Temelleri bölümünün bir parçası. Ders 15 / 23.

POST isteği verileri gövdesinde gönderir ve Express, siz istemediğiniz sürece gövdeyi okumaz.

app.use(express.json());

app.post('/api/loans', (req, res) => {
    const { bookId, member } = req.body;
    res.status(201).json({ bookId, member, due: '2026-11-08' });
});

GET bir şey ister; POST oluşturulması için bir şey gönderir. express.json(), her JSON gövdesini req.body içine okuyan bir ara yazılımdır. Bu olmadan req.body değeri undefined olur. Bir şey oluşturan rota, oluşturduğu şeyi içeren 201 yanıtı verir.

Gövdeyi kaydetmeden önce kontrol et. Eksik bir alan istemcinin hatasıdır; bu nedenle 400 yanıtı ver ve hiçbir şeyi kaydetme.

challenge icon

Görev

Kolay

Ziyaretçiler kendi tariflerini ekleyebilir. Bir program, yeni tarifi bir POST isteğinin gövdesinde JSON olarak gönderir ve API'niz bu tarifi kaydeder.

  1. server.js dosyasında, JSON gövdesinin req.body içinde alınabilmesi için rotalardan önce, diğer app.use satırlarının yanına express.json() ekleyin.
  2. /api/recipes adresine yönelik POST istekleri için bir rota ekleyin. Bu rota, örneğin {"title": "Miso Soup", "tags": ["vegan", "soup"]} gibi, gövdeden title ve tags değerlerini okur.
  3. Sıradaki numarayı kimlik olarak kullanarak yeni tarifi oluşturur: dört tarifin kimlikleri 1'den 4'e kadardır, bu nedenle ilk yeni tarif 5 numarasını alır. Gönderilen başlığı ve etiketleri korur. tags gönderilmemişse boş bir liste olan [] değerini kullanır.
  4. Tarifi recipes dizisine ekler; böylece GET /api/recipes tarif listesinde bu tarifi de gösterir. Ardından 201 durum koduyla ve yeni tarifi JSON olarak yanıtlar: {"id": 5, "title": "Miso Soup", "tags": ["vegan", "soup"]}
  5. Gövde içinde title yoksa hiçbir şeyi kaydetmez ve 400 durum koduyla şu JSON yanıtını verir: {"error": "A recipe needs a title"}

Deneyin: Çalıştır'a basın. Yöntem seçicisinde POST'u seçin, yol olarak /api/recipes yazın ve gövde kutusuna {"title": "Miso Soup", "tags": ["vegan", "soup"]} girin. 201 durum kodunu ve "id": 5 değerine sahip tarifi görmelisiniz. GET'i seçin ve /api/recipes gönderin: Miso Soup son sırada olmak üzere beş tarif görünür. Ardından {"tags": ["dinner"]} değerini /api/recipes adresine POST yöntemiyle gönderin: 400 durum kodu ve {"error":"A recipe needs a title"} yanıtı görünür. GET /api/recipes hâlâ beş tarif listeler.

Kendin dene

import { escapeHtml } from './html.js';
import express from 'express';
import { randomUUID } from 'node:crypto';
import { recipes } from './data.js';

const app = express();

app.use((req, res, next) => {
    console.log(`${req.method} ${req.url}`);
    next();
});

app.use((req, res, next) => {
    res.set('X-Request-Id', randomUUID());
    next();
});

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, böylece her başlık ayrı bir satırda 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