İ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.
Görev
KolayZiyaretçiler kendi tariflerini ekleyebilir. Bir program, yeni tarifi bir POST isteğinin gövdesinde JSON olarak gönderir ve API'niz bu tarifi kaydeder.
server.jsdosyasında, JSON gövdesininreq.bodyiçinde alınabilmesi için rotalardan önce, diğerapp.usesatırlarının yanınaexpress.json()ekleyin./api/recipesadresine yönelik POST istekleri için bir rota ekleyin. Bu rota, örneğin{"title": "Miso Soup", "tags": ["vegan", "soup"]}gibi, gövdedentitlevetagsdeğerlerini okur.- 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.
tagsgönderilmemişse boş bir liste olan[]değerini kullanır. - Tarifi
recipesdizisine ekler; böyleceGET /api/recipestarif 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"]} - Gövde içinde
titleyoksa 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');
});
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