Routing — GET, POST, PUT, PATCH, DELETE

~15 daq · Express · Kirish va Asoslar

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