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:
app.jsda/tasksuchunGETvaPOSTmarshrutlarini yozing, ikkalasinicurlbilan tekshiring;/tasks/:idmarshrutini qo’shib,/tasks/5va/tasks/abcni so’rang — ikkalasi ham javob berishini ko’ring;/users/:userId/tasks/:taskIdmarshrutini yozib, ikkala parametrni javobga chiqaring;/tasks/:idni/tasks/newdan yuqoriga qo’ying va/tasks/newni so’rang — noto’g’ri javobni o’z ko’zingiz bilan ko’ring, so’ng tartibni tuzating;- Mavjud bo’lmagan
/hellomanzilini so’rab,Cannot GETjavobini oling; - Vazifa marshrutlarini
routes/tasks.jsfayliga 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.
:idko’rinishidagi parametr manzilning o’zgaruvchan qismiga mos keladi, qiymatirequest.paramsda turadi.request.paramsqiymatlari har doim matn — son kerak bo’lsaNumber()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, prefiksapp.use()da bir marta beriladi.
Keyingi darsda so’rov va javob obyektlari —
request dan ma’lumot olish va response bilan to’g’ri holat kodini
qaytarish.