Route parametrlar — params, query, body
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