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:

  1. /tasks marshrutida request.query.search ni o’qib javobga chiqaring, ?search=kitob bilan tekshiring;
  2. Parametrsiz /tasks ni so’rang — undefined chiqishini ko’ring, so’ng || "" bilan standart qiymat bering;
  3. app.use(express.json()) ni yozmay turib POST so’rov yuboring va request.body qiymatini terminalda ko’ring, keyin qatorni qo’shib qayta sinang;
  4. /api/tasks marshrutida massivni response.json() bilan qaytaring va curl javobini o’qing;
  5. /api/tasks/:id da topilmagan vazifa uchun 404 qaytaring, curl -i bilan holat kodini tekshiring;
  6. 400 javobidan keyingi return ni ataylab olib tashlang va Cannot set headers xatosini 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.body ni o’qish uchun app.use(express.json()) marshrutlardan yuqorida turishi shart.
  • response.send() matn, response.json() esa JSON yuboradi va Content-Type ni 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: response oldiga return qo’ying, aks holda Cannot set headers xatosi chiqadi.

Keyingi darsda middleware va next()express.json() parda ortida qanday ishlashini va o’z middleware’ingizni yozishni ko’ramiz.

Bu dars foydali bo'ldimi?

marta ko'rildi