Express statik fayllar bilan ishlash
Hozirgacha server faqat matn va JSON qaytardi. Lekin haqiqiy saytda HTML sahifa, CSS fayl va rasmlar ham kerak. Ularni har biri uchun alohida marshrut yozib berish mumkinmi? Mumkin, lekin shart emas — Express buning uchun bitta middleware beradi.
Muammo: har fayl uchun marshrut
Uchta fayl bo’lsa, kod shunday ko’rinadi:
// ❌ Bunday yozilmaydi
app.get("/index.html", (request, response) => {
response.sendFile("/home/user/express-app/public/index.html");
});
app.get("/style.css", (request, response) => {
response.sendFile("/home/user/express-app/public/style.css");
});
O’ntagacha rasm qo’shilsa, o’nta marshrut kerak bo’ladi. Har yangi fayl — yangi qator.
express.static()
Loyihada public papkasini yarating va ichiga uch fayl qo’ying.
public/index.html:
<!DOCTYPE html>
<html lang="uz">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vazifalar</title>
<link rel="stylesheet" href="/style.css" />
</head>
<body>
<h1>Vazifalar ro'yxati</h1>
<p id="status">Yuklanmoqda...</p>
<script src="/app.js"></script>
</body>
</html>
public/style.css:
body {
font-family: system-ui, sans-serif;
max-width: 640px;
margin: 40px auto;
padding: 0 16px;
}
h1 {
color: #1f2937;
}
public/app.js:
// Bu fayl brauzerda ishlaydi, serverda emas
const status = document.getElementById("status");
status.textContent = "Sahifa serverdan yuklandi";
Endi serverga bitta qator qo’shamiz:
const express = require("express");
const app = express();
// public papkasidagi fayllarni tashqariga ochamiz
app.use(express.static("public"));
app.listen(3000, () => {
console.log("Server ishga tushdi: http://localhost:3000");
});
Brauzerda http://localhost:3000 ni oching. Sahifa stillar bilan
ochiladi va matn Sahifa serverdan yuklandi ga o’zgaradi — uchala fayl
ham berildi.
Manzil papka nomini o’z ichiga olmaydi
Diqqat qilinadigan nuqta: HTML ichida /style.css yozilgan,
/public/style.css emas.
| Fayl diskda | Brauzerdagi manzil |
|---|---|
public/index.html |
http://localhost:3000/ |
public/style.css |
http://localhost:3000/style.css |
public/app.js |
http://localhost:3000/app.js |
public/images/logo.png |
http://localhost:3000/images/logo.png |
public — papkaning ildizi, uning nomi manzilga qo’shilmaydi.
Bu xavfsizlik uchun ham foydali: papkadan tashqaridagi fayllar
(app.js, package.json, node_modules) tashqariga ochilmaydi.
path.join va __dirname
express.static("public") ishladi, lekin unda yashirin muammo bor:
bu yo’l joriy ishchi papkaga nisbatan hisoblanadi.
Serverni boshqa papkadan ishga tushirsangiz:
cd ..
node express-app/app.js
Statik fayllar topilmay qoladi — Express public ni noto’g’ri joydan
qidiradi. To’g’ri yechim:
const express = require("express");
const path = require("path");
const app = express();
// Fayl joylashgan papkadan boshlab aniq yo'l quramiz
app.use(express.static(path.join(__dirname, "public")));
app.listen(3000, () => {
console.log("Server ishga tushdi: http://localhost:3000");
});
Nega qo’lda birlashtirmaslik kerak:
// ❌ Windows'da muammo beradi
const publicPath = __dirname + "/public";
// ✅ Har tizimda ishlaydi
const publicPath = path.join(__dirname, "public");
path moduli haqida batafsil
path va papkalar darsida yozilgan.
Frontend va backend bitta serverda
Endi qiziq qismi: statik fayllar va API bitta ilovada yashashi mumkin.
const express = require("express");
const path = require("path");
const app = express();
app.use(express.static(path.join(__dirname, "public")));
// API — dinamik javob
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);
});
app.listen(3000, () => {
console.log("Server ishga tushdi: http://localhost:3000");
});
public/app.js ni yangilang — u endi serverdan ma’lumot so’raydi:
const status = document.getElementById("status");
// O'z serverimizdagi API ga murojaat
fetch("/api/tasks")
.then((response) => response.json())
.then((tasks) => {
status.textContent = `Jami vazifalar: ${tasks.length}`;
})
.catch(() => {
status.textContent = "Ma'lumot yuklanmadi";
});
Brauzerda sahifani yangilang:
Vazifalar ro'yxati
Jami vazifalar: 2
Diqqat qiling: fetch("/api/tasks") da to’liq manzil yozilmadi. Sahifa
ham, API ham bitta serverdan kelgani uchun nisbiy yo’l yetarli.
fetch darsida ko’rilgan usul shu yerda ishlayapti,
faqat endi server sizniki.
res.sendFile
Ba’zan aniq bitta faylni marshrut orqali berish kerak bo’ladi:
app.get("/about", (request, response) => {
response.sendFile(path.join(__dirname, "public", "about.html"));
});
response.sendFile() to’liq yo’l talab qiladi — shuning uchun
path.join va __dirname yana kerak. Nisbiy yo’l berilsa, Express xato
qaytaradi.
| Vosita | Qachon |
|---|---|
express.static() |
Papkadagi hamma faylni ochish |
response.sendFile() |
Bitta faylni aniq marshrutda berish |
Ko’p holatda birinchisi yetarli.
Kesh sarlavhalari
Statik fayl har so’rovda qayta yuklanishi shart emas — brauzer uni saqlab qo’yishi mumkin.
// Fayllarni bir kun davomida brauzerda saqlashga ruxsat
app.use(express.static(path.join(__dirname, "public"), {
maxAge: "1d",
}));
Tekshirish:
curl -I http://localhost:3000/style.css
HTTP/1.1 200 OK
Content-Type: text/css; charset=UTF-8
Cache-Control: public, max-age=86400
Cache-Control sarlavhasi brauzerga faylni 86400 soniya (bir kun)
saqlashni aytadi. Natijada takroriy tashriflar tezlashadi.
Amaliy mashq
express-app loyihasida davom eting:
publicpapkasini yaratib, ichigaindex.html,style.cssvaapp.jsfayllarini joylashtiring;app.use(express.static("public"))qo’shib, brauzerda sahifa stillar bilan ochilishini tekshiring;- HTML ichidagi
/style.cssni/public/style.cssga o’zgartirib ko’ring — stil yo’qolishini va nega shunday bo’lganini tushuntiring; - Yo’lni
path.join(__dirname, "public")ga almashtiring va serverni boshqa papkadan ishga tushirib sinang; /api/tasksmarshrutini qo’shib,public/app.jsdafetchbilan vazifalar sonini sahifaga chiqaring;maxAge: "1d"qo’shib,curl -IbilanCache-Controlsarlavhasini ko’ring.
3-qadam eng ko’p chalkashlik tug’diradigan nuqtani ochadi: public
papkasining nomi manzilga tushmaydi.
Qisqacha xulosa
- Statik fayl — server o’zgartirmasdan beradigan tayyor fayl: HTML, CSS, rasm.
express.static()butun papkani bitta qatorda ochadi, har fayl uchun marshrut kerak emas.- Papka nomi manzilga qo’shilmaydi:
public/style.cssfayli/style.cssmanzilida ochiladi. publicichidagi hamma narsa internetga ochiq — maxfiy fayl u yerda turmaydi.- Yo’lni
path.join(__dirname, "public")bilan quring — aks holda server boshqa papkadan ishga tushirilganda fayllar topilmaydi. - Statik fayl va API bitta serverda yashay oladi;
fetch("/api/tasks")nisbiy yo’l bilan ishlaydi. maxAgekesh sarlavhasini qo’yadi, lekin ishlab chiqish paytida chalkashtiradi.
Keyingi darsda xatolarni boshqarish —
o’z 404 sahifangiz va xato middleware’i bilan tanishamiz.