Express so'rov va javob obyektlari
Marshrutlash darsida har marshrut funksiyasi ikki
argument olishini ko’rdik: request va response. Ular darsning
qahramoni edi, lekin ulardan faqat params ishlatildi. Endi ikkalasini
ham to’liq ochamiz: so’rovdan ma’lumotni qayerdan olish va javobni qanday
to’g’ri qaytarish.
Ma’lumot serverga uch yo’l bilan keladi
Bu darsning asosiy jadvali. Qolgan hamma narsa shundan kelib chiqadi.
| Manba | Qayerda turadi | Misol |
|---|---|---|
| Yo’l parametri | request.params |
/tasks/5 |
| So’rov qatori | request.query |
/tasks?search=kitob |
| So’rov tanasi | request.body |
POST bilan yuborilgan JSON |
Farqni his qilish uchun: parametr qaysi resurs kerakligini aytadi, so’rov qatori uni qanday ko’rsatishni sozlaydi, tana esa yangi ma’lumot olib keladi.
request.query — so’rov qatori
Manzildagi ? dan keyingi qism — so’rov qatori.
const express = require("express");
const app = express();
app.get("/tasks", (request, response) => {
// ?search=kitob&limit=10 → { search: "kitob", limit: "10" }
const search = request.query.search;
const limit = request.query.limit;
response.send(`Qidiruv: ${search}, chegara: ${limit}`);
});
app.listen(3000, () => {
console.log("Server ishga tushdi: http://localhost:3000");
});
Tekshirish:
curl "http://localhost:3000/tasks?search=kitob&limit=10"
Qidiruv: kitob, chegara: 10
Bir nechta qiymat & bilan ajratiladi. Tartib ahamiyatsiz:
?limit=10&search=kitob ham bir xil natija beradi.
request.body va express.json()
POST so’rovi bilan yuborilgan ma’lumot so’rov tanasida keladi.
Sinab ko’ramiz:
app.post("/tasks", (request, response) => {
console.log(request.body);
response.send("Qabul qilindi");
});
curl -X POST http://localhost:3000/tasks \
-H "Content-Type: application/json" \
-d '{"title":"Kitob oqish"}'
Terminalda undefined chiqadi. Sabab muhim: Express so’rov tanasini
o’zi o’qimaydi.
Bitta qator hammasini hal qiladi:
const express = require("express");
const app = express();
// So'rov tanasidagi JSON ni o'qishga ruxsat beramiz
app.use(express.json());
app.post("/tasks", (request, response) => {
const title = request.body.title;
response.send("Qabul qilindi: " + title);
});
app.listen(3000, () => {
console.log("Server ishga tushdi: http://localhost:3000");
});
curl -X POST http://localhost:3000/tasks \
-H "Content-Type: application/json" \
-d '{"title":"Kitob oqish"}'
Qabul qilindi: Kitob oqish
Javob yuborish usullari
Endi ikkinchi tomon — response.
| Metod | Nima yuboradi |
|---|---|
response.send() |
Matn yoki HTML |
response.json() |
JSON |
response.status() |
Holat kodini belgilaydi |
response.sendStatus() |
Faqat holat kodi va uning nomi |
response.redirect() |
Boshqa manzilga yo’naltiradi |
response.json() obyektni JSON matniga aylantiradi va to’g’ri
Content-Type ni qo’yadi:
app.get("/api/tasks", (request, response) => {
const tasks = [
{ id: 1, title: "Kitob o'qish", isDone: false },
{ id: 2, title: "Kod yozish", isDone: true },
];
response.json(tasks);
});
curl http://localhost:3000/api/tasks
[{"id":1,"title":"Kitob o'qish","isDone":false},{"id":2,"title":"Kod yozish","isDone":true}]
JSON tuzilishi JSON darsida ko’rilgan formatda —
brauzerdagi fetch shu javobni to’g’ridan-to’g’ri o’qiy oladi.
Holat kodlari
Har javob o’zi bilan raqam olib keladi. U so’rov qanday tugaganini aytadi.
| Kod | Ma’nosi | Qachon |
|---|---|---|
200 |
OK | So’rov muvaffaqiyatli |
201 |
Created | Yangi ma’lumot yaratildi |
400 |
Bad Request | Foydalanuvchi noto’g’ri ma’lumot yubordi |
404 |
Not Found | So’ralgan narsa topilmadi |
500 |
Internal Server Error | Serverda xato yuz berdi |
Birinchi raqam guruhni bildiradi: 2xx — muvaffaqiyat, 4xx —
foydalanuvchi xatosi, 5xx — server xatosi. Batafsil tasnif
HTTP so’rov va javob darsida bor.
response.status() kodni belgilaydi va response ning o’zini qaytaradi
— shuning uchun zanjir qilib yoziladi:
const tasks = [
{ id: 1, title: "Kitob o'qish", isDone: false },
{ id: 2, title: "Kod yozish", isDone: true },
];
app.get("/api/tasks/:id", (request, response) => {
const id = Number(request.params.id);
const task = tasks.find((item) => item.id === id);
if (!task) {
// Topilmadi — 404 va tushuntirish
return response.status(404).json({ error: "Vazifa topilmadi" });
}
response.json(task);
});
curl -i http://localhost:3000/api/tasks/99
HTTP/1.1 404 Not Found
Content-Type: application/json; charset=utf-8
{"error":"Vazifa topilmadi"}
curl -i sarlavhalarni ham ko’rsatadi — holat kodini shu yerda
tekshirasiz.
response.sendStatus() — faqat kod kerak bo’lganda qisqa yo’l:
app.delete("/api/tasks/:id", (request, response) => {
// Haqiqiy o'chirish mantig'i CRUD darsida yoziladi
response.sendStatus(204);
});
204 — “muvaffaqiyatli, lekin qaytaradigan ma’lumot yo’q”.
Javob faqat bir marta yuboriladi
Bu Express’ning o’zgarmas qoidasi. Quyidagi kodda xato bor:
// ❌ Ikki marta javob
app.get("/tasks/:id", (request, response) => {
const id = Number(request.params.id);
if (Number.isNaN(id)) {
response.status(400).json({ error: "id son bo'lishi kerak" });
}
response.json({ id: id, title: "Kitob o'qish" });
});
/tasks/abc so’ralganda ikkala response ham ishlaydi.
res.redirect
Foydalanuvchini boshqa manzilga yuborish:
app.get("/old-tasks", (request, response) => {
// Eski manzilni yangisiga yo'naltiramiz
response.redirect("/api/tasks");
});
curl -i http://localhost:3000/old-tasks
HTTP/1.1 302 Found
Location: /api/tasks
Brauzer Location sarlavhasini ko’rib, yangi manzilga o’zi o’tadi.
302 — vaqtincha yo’naltirish. Manzil butunlay o’zgargan bo’lsa,
response.redirect(301, "/api/tasks") yoziladi.
Yo’naltirish forma yuborilgandan keyin ko’p ishlatiladi: foydalanuvchi sahifani yangilaganda forma qayta yuborilmasligi uchun.
Amaliy mashq
express-app loyihasida davom eting:
/tasksmarshrutidarequest.query.searchni o’qib javobga chiqaring,?search=kitobbilan tekshiring;- Parametrsiz
/tasksni so’rang —undefinedchiqishini ko’ring, so’ng|| ""bilan standart qiymat bering; app.use(express.json())ni yozmay turibPOSTso’rov yuboring varequest.bodyqiymatini terminalda ko’ring, keyin qatorni qo’shib qayta sinang;/api/tasksmarshrutida massivniresponse.json()bilan qaytaring vacurljavobini o’qing;/api/tasks/:idda topilmagan vazifa uchun404qaytaring,curl -ibilan holat kodini tekshiring;400javobidan keyingireturnni ataylab olib tashlang vaCannot set headersxatosini terminalda ko’ring.
6-qadam eng muhimi: bu xatoni bir marta o’zingiz chaqirsangiz, sababini umr bo’yi eslab qolasiz.
Qisqacha xulosa
- Ma’lumot serverga uch yo’l bilan keladi:
request.params,request.query,request.body. request.query— manzildagi?dan keyingi qism, qiymatlari matn va ular bo’lmasligi mumkin.request.bodyni o’qish uchunapp.use(express.json())marshrutlardan yuqorida turishi shart.response.send()matn,response.json()esa JSON yuboradi vaContent-Typeni o’zi qo’yadi.- Holat kodi so’rov natijasini aytadi:
200,201,400,404,500. response.status(404).json(...)zanjiri kod va ma’lumotni birga yuboradi.- Bitta so’rovga bitta javob:
responseoldigareturnqo’ying, aks holdaCannot set headersxatosi chiqadi.
Keyingi darsda middleware va next() — express.json()
parda ortida qanday ishlashini va o’z middleware’ingizni yozishni ko’ramiz.