Route parametrlar — params, query, body

~15 daq · Express · Kirish va Asoslar

So'rov bilan ma'lumot yuborish — uch usul

Mijoz serverga so'rov yuborganda ko'pincha qo'shimcha ma'lumot ham yuboradi: qaysi foydalanuvchi, qaysi sahifa, qanday filter. Bu ma'lumot uch xil joyda kelishi mumkin:

URL:    /users/42              → req.params  (kim?)
URL:    /users?page=2&limit=10 → req.query   (qanday?)
Body:   { "name": "Ali" }      → req.body    (nima?)

Har birining o'z maqsadi bor.


req.params — URL parametrlari

URL ning bir qismi o'zgaruvchan bo'lganda — : bilan belgilanadi. Bu — route parametr.

app.get('/users/:id', (req, res) => {
  console.log(req.params.id); // '42'  ← string!
  res.json({ id: req.params.id });
});

/users/42 so'rovida req.params.id — '42' (string). Raqam kerak bo'lsa — parseInt yoki + bilan aylantirish kerak:

const id = parseInt(req.params.id);
// yoki
const id = +req.params.id;

Bir nechta parametr:

app.get('/users/:userId/posts/:postId', (req, res) => {
  const { userId, postId } = req.params;
  res.json({ userId, postId });
});
// /users/5/posts/12 → { userId: '5', postId: '12' }

req.query — query string parametrlari

URL da ? dan keyin keluvchi parametrlar — query string. Filtrlash, saralash, sahifalash uchun ishlatiladi.

app.get('/users', (req, res) => {
  console.log(req.query);
  // /users?page=2&limit=10&sort=name
  // → { page: '2', limit: '10', sort: 'name' }
});

Query parametrlar ham har doim string keladi. Raqamga aylantirish kerak:

app.get('/users', (req, res) => {
  const page  = parseInt(req.query.page)  || 1;
  const limit = parseInt(req.query.limit) || 10;
  const sort  = req.query.sort || 'id';

  // Ma'lumotlar bazasidan olish...
  res.json({ page, limit, sort, users: [] });
});

|| 1 — parametr berilmasa standart qiymat ishlatiladi.

Ixtiyoriy parametrlar:

app.get('/products', (req, res) => {
  const { category, minPrice, maxPrice, search } = req.query;

  // Faqat berilgan parametrlar bo'yicha filter
  let products = allProducts;

  if (category)  products = products.filter(p => p.category === category);
  if (minPrice)  products = products.filter(p => p.price >= +minPrice);
  if (maxPrice)  products = products.filter(p => p.price <= +maxPrice);
  if (search)    products = products.filter(p => p.name.includes(search));

  res.json(products);
});
// /products?category=electronics&minPrice=100&maxPrice=500

req.body — so'rov tanasi

POST, PUT, PATCH so'rovlarida ma'lumot body da yuboriladi. Body ni o'qish uchun avval middleware kerak:

app.use(express.json()); // JSON body uchun
app.use(express.urlencoded({ extended: true })); // HTML form uchun

Bu middleware lar body ni o'qib, req.body ga yuklaydi.

app.post('/users', (req, res) => {
  console.log(req.body);
  // { "name": "Ali", "email": "ali@example.com", "age": 25 }

  const { name, email, age } = req.body;
  res.status(201).json({ id: Date.now(), name, email, age });
});

express.json() va express.urlencoded() farqi:

express.json() — Content-Type: application/json bilan kelgan body uchun. Frontend (React, Vue) va mobil ilovalar JSON yuboradi.

express.urlencoded() — HTML <form> submit qilganda keladi. Content-Type: application/x-www-form-urlencoded.

Zamonaviy API larda asosan express.json() yetarli.


req.headers — so'rov headerlari

Ba'zan mijoz header orqali ma'lumot yuboradi — masalan, autentifikatsiya tokeni:

app.get('/profile', (req, res) => {
  const token = req.headers['authorization'];
  // 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'

  const userAgent = req.headers['user-agent'];
  // 'Mozilla/5.0 ...'

  res.json({ token, userAgent });
});

Header nomlari kichik harfda keladi — Authorization emas, authorization.


Hammasi birgalikda — amaliy misol

const express = require('express');
const app     = express();

app.use(express.json());

const products = [
  { id: 1, name: 'Noutbuk',  category: 'electronics', price: 1200 },
  { id: 2, name: 'Telefon',  category: 'electronics', price: 800  },
  { id: 3, name: 'Kitob',    category: 'books',        price: 15   },
  { id: 4, name: 'Qalam',    category: 'stationery',   price: 2    },
];

// GET /products?category=electronics&maxPrice=1000
app.get('/products', (req, res) => {
  const { category, maxPrice } = req.query;
  let result = products;

  if (category) result = result.filter(p => p.category === category);
  if (maxPrice) result = result.filter(p => p.price <= +maxPrice);

  res.json(result);
});

// GET /products/2
app.get('/products/:id', (req, res) => {
  const product = products.find(p => p.id === +req.params.id);
  if (!product) return res.status(404).json({ message: 'Topilmadi' });
  res.json(product);
});

// POST /products
app.post('/products', (req, res) => {
  const { name, category, price } = req.body;
  const newProduct = { id: Date.now(), name, category, price };
  products.push(newProduct);
  res.status(201).json(newProduct);
});

app.listen(3000);

Tez-tez uchraydigan xatolar

Params ni raqamga aylantirmaslik:

const user = users.find(u => u.id === req.params.id);
// u.id = 1 (number), req.params.id = '1' (string)
// 1 === '1' → false! Hech narsa topilmaydi

// To'g'ri:
const user = users.find(u => u.id === +req.params.id);

express.json() ni unutish:

app.post('/users', (req, res) => {
  console.log(req.body); // undefined
  // express.json() qo'shilmagan
});

Query parametrni tekshirmaslik:

const limit = parseInt(req.query.limit);
// limit berilmasa → NaN
// NaN bilan hisoblash → xato natija

// To'g'ri:
const limit = parseInt(req.query.limit) || 10;

Xulosa

So'rov bilan ma'lumot yuborishning uch usuli:

Qayerda Maqsad Misol
req.params URL da Aniq resurs /users/42
req.query ? dan keyin Filter, sort, page ?page=2&limit=10
req.body Body da Yangi ma'lumot { "name": "Ali" }

Params va query har doim string — raqam kerak bo'lsa aylantirish kerak.


Keyingi dars

5-dars: Response metodlari — send, json, status, redirect, download