Routing — GET, POST, PUT, PATCH, DELETE
Routing nima?
Routing — "bu so'rov qaysi handler ga borishi kerak?" degan savolga javob. Xuddi pochta tizimi kabi: har bir xat manzilga qarab to'g'ri joyga yetkaziladi.
Express da routing ikki narsaga qarab ishlaydi: URL va HTTP metod. Bir xil URL ga turli metodlar bilan so'rov yuborilsa — turli handler lar chaqiriladi.
GET /users → foydalanuvchilar ro'yxatini olish
POST /users → yangi foydalanuvchi yaratish
Bir xil URL — /users. Lekin GET va POST — turli maqsad, turli handler.
HTTP metodlar — nima uchun turli metodlar bor?
HTTP metodlar so'rovning niyatini bildiradi. Bu qoidalar — REST arxitekturasining asosi.
GET — ma'lumot olish. Server da hech narsa o'zgarmaydi. Brauzer manzil satriga yozganda — GET so'rov yuboradi.
POST — yangi narsa yaratish. Ma'lumot body da yuboriladi.
PUT — mavjud narsani to'liq almashtirish. Barcha maydonlar yuboriladi.
PATCH — mavjud narsani qisman yangilash. Faqat o'zgargan maydonlar yuboriladi.
DELETE — o'chirish.
GET /users → ro'yxat
GET /users/1 → bitta foydalanuvchi
POST /users → yangi yaratish
PUT /users/1 → to'liq yangilash
PATCH /users/1 → qisman yangilash
DELETE /users/1 → o'chirish
Bu — CRUD (Create, Read, Update, Delete) ning HTTP dagi ko'rinishi.
Express da routing
const express = require('express');
const app = express();
app.use(express.json()); // body ni JSON sifatida o'qish uchun
// Xotira "bazasi" — hozircha
let users = [
{ id: 1, name: 'Ali', email: 'ali@example.com' },
{ id: 2, name: 'Vali', email: 'vali@example.com' },
];
// GET /users — ro'yxat
app.get('/users', (req, res) => {
res.json(users);
});
// GET /users/:id — bitta
app.get('/users/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) return res.status(404).json({ message: 'Topilmadi' });
res.json(user);
});
// POST /users — yaratish
app.post('/users', (req, res) => {
const newUser = { id: Date.now(), ...req.body };
users.push(newUser);
res.status(201).json(newUser);
});
// PUT /users/:id — to'liq yangilash
app.put('/users/:id', (req, res) => {
const idx = users.findIndex(u => u.id === parseInt(req.params.id));
if (idx === -1) return res.status(404).json({ message: 'Topilmadi' });
users[idx] = { id: users[idx].id, ...req.body };
res.json(users[idx]);
});
// PATCH /users/:id — qisman yangilash
app.patch('/users/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) return res.status(404).json({ message: 'Topilmadi' });
Object.assign(user, req.body); // faqat kelgan maydonlarni yangilash
res.json(user);
});
// DELETE /users/:id — o'chirish
app.delete('/users/:id', (req, res) => {
const idx = users.findIndex(u => u.id === parseInt(req.params.id));
if (idx === -1) return res.status(404).json({ message: 'Topilmadi' });
users.splice(idx, 1);
res.status(204).send(); // 204 — muvaffaqiyatli, kontent yo'q
});
app.listen(3000);
PUT va PATCH farqi — amalda
Bu farqni tushunish muhim. Foydalanuvchi:
{ "id": 1, "name": "Ali", "email": "ali@example.com", "age": 25 }
Faqat ismni o'zgartirmoqchi:
// PUT — to'liq almashtirish:
// Yuboriladi: { "name": "Alisher" }
// Natija: { "id": 1, "name": "Alisher" }
// email va age yo'qoldi!
// PATCH — qisman yangilash:
// Yuboriladi: { "name": "Alisher" }
// Natija: { "id": 1, "name": "Alisher", "email": "ali@example.com", "age": 25 }
// Faqat name o'zgardi, qolganlar saqlanib qoldi
Amalda ko'pincha PATCH ishlatiladi — foydalanuvchi faqat o'zgartirmoqchi bo'lgan narsani yuboradi.
app.all — barcha metodlar
Ba'zan bir URL ga barcha metodlar uchun bir xil narsa qilish kerak — masalan, logging:
app.all('/admin/*', (req, res, next) => {
console.log(`Admin so'rov: ${req.method} ${req.url}`);
next(); // keyingi handler ga o'tish
});
app.route — bir URL, bir nechta metod
Bir URL uchun bir nechta metod yozilganda — app.route kodni ixchamlashtiradi:
// Oddiy usul:
app.get('/users/:id', getUser);
app.put('/users/:id', updateUser);
app.delete('/users/:id', deleteUser);
// app.route bilan:
app.route('/users/:id')
.get(getUser)
.put(updateUser)
.delete(deleteUser);
Natija bir xil — faqat URL bir marta yoziladi.
Tez-tez uchraydigan xatolar
Route tartibining ahamiyati:
app.get('/users/me', (req, res) => {
res.json({ name: 'Joriy foydalanuvchi' });
});
app.get('/users/:id', (req, res) => {
res.json({ id: req.params.id });
});
/users/me so'rovi birinchi handler ga tushadi — to'g'ri. Lekin tartib teskari bo'lsa:
app.get('/users/:id', ...); // /users/me → bu yerga tushadi, id = 'me'
app.get('/users/me', ...); // hech qachon chaqirilmaydi!
Aniqroq route lar avval yoziladi.
express.json() unutish:
app.post('/users', (req, res) => {
console.log(req.body); // undefined!
});
app.use(express.json()) qo'shilmasa — req.body undefined bo'ladi. Bu middleware body ni parse qiladi.
Status code ni unutish:
// Xato — 200 qaytaradi, lekin yaratish uchun 201 kerak:
app.post('/users', (req, res) => {
res.json(newUser);
});
// To'g'ri:
app.post('/users', (req, res) => {
res.status(201).json(newUser);
});
Xulosa
Routing — URL va HTTP metodga qarab to'g'ri handler ni topish. Har bir HTTP metodning o'z maqsadi bor: GET olish, POST yaratish, PUT to'liq yangilash, PATCH qisman yangilash, DELETE o'chirish.
Route lar tartib muhim — aniqroq route lar avval yoziladi.
Keyingi dars
4-dars: Route parametrlar — params, query, body