Express marshrutlash (routing)

O’tgan darsda uchta manzil yozdik: /, /about, /contact. Endi yuzta maqolali sayt kerak bo’lsa-chi? Yuzta app.get() yozib chiqilmaydi. Marshrutlash aynan shu muammoni yechadi: bitta marshrut o’zgaruvchan manzillar guruhiga javob beradi.

HTTP usullari

Brauzer manzilga kirganda GET so’rovini yuboradi. Lekin HTTP so’rov usullari bundan ko’proq, va Express har biriga alohida metod beradi.

Usul Vazifa Express
GET Ma’lumot olish app.get()
POST Yangi ma’lumot yaratish app.post()
PUT Mavjudini yangilash app.put()
DELETE O’chirish app.delete()

Muhim jihat: manzil bir xil, usul har xil bo’lishi mumkin. Bu ikki alohida marshrut:

const express = require("express");

const app = express();

app.get("/tasks", (request, response) => {
  response.send("Vazifalar ro'yxati");
});

app.post("/tasks", (request, response) => {
  response.send("Yangi vazifa qo'shildi");
});

app.listen(3000, () => {
  console.log("Server ishga tushdi: http://localhost:3000");
});

Brauzerda http://localhost:3000/tasks ni ochsangiz, Vazifalar ro'yxati chiqadi — brauzer GET yuboradi. POST marshrutini brauzer manzil qatoridan sinab bo’lmaydi, uning uchun curl kerak:

curl -X POST http://localhost:3000/tasks
Yangi vazifa qo'shildi

Yo’l parametrlari

Endi asosiy masalaga qaytamiz. Har vazifa uchun alohida marshrut o’rniga manzilning o’zgaruvchan qismini belgilaymiz:

app.get("/tasks/:id", (request, response) => {
  // :id o'rniga kelgan qiymat shu yerda
  const id = request.params.id;
  response.send("Vazifa raqami: " + id);
});

Ikki nuqta bilan boshlangan :id — parametr. U manzilning o’sha qismidagi har qanday qiymatga mos keladi.

So’ralgan manzil request.params.id
/tasks/5 "5"
/tasks/99 "99"
/tasks/abc "abc"

Tekshirib ko’ring:

curl http://localhost:3000/tasks/5
Vazifa raqami: 5

Bir nechta parametr

Bitta manzilda bir nechta parametr bo’lishi mumkin:

app.get("/users/:userId/tasks/:taskId", (request, response) => {
  const userId = request.params.userId;
  const taskId = request.params.taskId;
  response.send(`${userId}-foydalanuvchining ${taskId}-vazifasi`);
});
curl http://localhost:3000/users/3/tasks/7
3-foydalanuvchining 7-vazifasi

Bunday manzil tuzilishni ko’rsatadi: 7-vazifa 3-foydalanuvchiga tegishli.

Marshrutlar tartibi

Express marshrutlarni yozilgan tartibda tekshiradi va birinchi mos kelganida to’xtaydi. Shuning uchun tartib natijani o’zgartiradi.

Quyidagi kodda xato bor:

// ❌ Noto'g'ri tartib
app.get("/tasks/:id", (request, response) => {
  response.send("Vazifa raqami: " + request.params.id);
});

app.get("/tasks/new", (request, response) => {
  response.send("Yangi vazifa formasi");
});

/tasks/new so’ralganda Yangi vazifa formasi kutasiz, lekin Vazifa raqami: new chiqadi. Sabab: :id har qanday qiymatga mos keladi, shu jumladan new so’ziga ham. Birinchi marshrut ishlab bo’ladi, ikkinchisiga navbat kelmaydi.

Yechim — aniq manzilni parametrdan oldin yozish:

// ✅ To'g'ri tartib
app.get("/tasks/new", (request, response) => {
  response.send("Yangi vazifa formasi");
});

app.get("/tasks/:id", (request, response) => {
  response.send("Vazifa raqami: " + request.params.id);
});

Qoida qisqa: aniqroq marshrut yuqorida turadi.

app.all

Ba’zan manzil bir xil, lekin usuldan qat’i nazar bitta javob kerak bo’ladi. Shunda app.all ishlatiladi:

app.all("/maintenance", (request, response) => {
  response.send("Sayt texnik ishlar tufayli vaqtincha yopiq");
});

Bu marshrut GET, POST, PUT, DELETE — hammasiga bir xil javob qaytaradi.

curl -X DELETE http://localhost:3000/maintenance
Sayt texnik ishlar tufayli vaqtincha yopiq

Cannot GET — marshrut topilmadi

Mavjud bo’lmagan manzilni ochib ko’ring:

curl http://localhost:3000/hello
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>Error</title></head>
<body><pre>Cannot GET /hello</pre></body>
</html>

express.Router() bilan fayllarga bo’lish

Marshrutlar ko’paygan sari app.js uzayib ketadi. Express ularni alohida faylga chiqarish uchun Router beradi.

Loyihada routes papkasini yarating va ichida tasks.js faylini oching:

// routes/tasks.js
const express = require("express");

const router = express.Router();

// Bu yerdagi yo'llar "/tasks" ga nisbatan yoziladi
router.get("/", (request, response) => {
  response.send("Vazifalar ro'yxati");
});

router.get("/:id", (request, response) => {
  response.send("Vazifa raqami: " + request.params.id);
});

router.post("/", (request, response) => {
  response.send("Yangi vazifa qo'shildi");
});

module.exports = router;

Endi app.js da uni ulaymiz:

// app.js
const express = require("express");
const tasksRouter = require("./routes/tasks");

const app = express();

app.get("/", (request, response) => {
  response.send("Bosh sahifa");
});

// "/tasks" bilan boshlanadigan hamma so'rov routerga topshiriladi
app.use("/tasks", tasksRouter);

app.listen(3000, () => {
  console.log("Server ishga tushdi: http://localhost:3000");
});

Loyiha tuzilishi shunday bo’ladi:

express-app/
├── routes/
│   └── tasks.js
├── app.js
├── package.json
└── node_modules/

Tekshiring:

curl http://localhost:3000/tasks
curl http://localhost:3000/tasks/5
Vazifalar ro'yxati
Vazifa raqami: 5

Diqqat qiling: tasks.js ichida /tasks so’zi yozilmagan. Prefiks bir marta app.use("/tasks", tasksRouter) da beriladi. Manzilni o’zgartirish kerak bo’lsa, bitta joyni tahrirlaysiz.

module.exports va require ishlashi npm va package.json darsida ko’rilgan CommonJS tizimi bo’yicha.

Amaliy mashq

express-app loyihasida davom eting:

  1. app.js da /tasks uchun GET va POST marshrutlarini yozing, ikkalasini curl bilan tekshiring;
  2. /tasks/:id marshrutini qo’shib, /tasks/5 va /tasks/abc ni so’rang — ikkalasi ham javob berishini ko’ring;
  3. /users/:userId/tasks/:taskId marshrutini yozib, ikkala parametrni javobga chiqaring;
  4. /tasks/:id ni /tasks/new dan yuqoriga qo’ying va /tasks/new ni so’rang — noto’g’ri javobni o’z ko’zingiz bilan ko’ring, so’ng tartibni tuzating;
  5. Mavjud bo’lmagan /hello manzilini so’rab, Cannot GET javobini oling;
  6. Vazifa marshrutlarini routes/tasks.js fayliga ko’chirib, app.use("/tasks", tasksRouter) bilan ulang.

4-qadam eng muhimi: marshrut tartibi xatosini bir marta o’zingiz chaqirsangiz, keyinchalik uni darhol tanib olasiz.

Qisqacha xulosa

  • Har HTTP usuli uchun alohida metod bor: app.get, app.post, app.put, app.delete.
  • Bir xil manzil turli usullar bilan alohida marshrut hisoblanadi.
  • :id ko’rinishidagi parametr manzilning o’zgaruvchan qismiga mos keladi, qiymati request.params da turadi.
  • request.params qiymatlari har doim matn — son kerak bo’lsa Number() bilan aylantiring.
  • Express marshrutlarni yozilgan tartibda tekshiradi: aniq manzil parametrdan oldin turishi kerak.
  • Cannot GET /manzil — server ishlayapti, lekin marshrut topilmadi.
  • express.Router() marshrutlarni alohida faylga ajratadi, prefiks app.use() da bir marta beriladi.

Keyingi darsda so’rov va javob obyektlarirequest dan ma’lumot olish va response bilan to’g’ri holat kodini qaytarish.

Bu dars foydali bo'ldimi?

marta ko'rildi