Node.js va Express

Express asoslari

Sof http moduli bilan server yozish mumkin, lekin marshrutlash, so'rov tanasini o'qish va boshqa oddiy ishlar juda ko'p qo'l mehnatini talab qiladi. Express โ€” bu ishlarni soddalashtiradigan, Node.js uchun eng mashhur veb-freymvork. Ushbu darsda Express asoslarini o'rganamiz.

Nega Express?

Express โ€” Node.js uchun minimalist va moslashuvchan veb-freymvork. U sof http moduli ustiga qulay qatlam qo'shadi:

Bir xil vazifani sof http va Express'da solishtiring โ€” Express kodi ancha qisqa va tushunarli. Aynan shuning uchun Express dunyoda eng ko'p ishlatiladigan Node.js freymvorklaridan biri.

O'rnatish

Express โ€” tashqi paket, shuning uchun uni npm orqali o'rnatish kerak. Avval loyiha yarating:

mkdir mening-serverim
cd mening-serverim
npm init -y
npm install express

Endi Express loyihangizda mavjud va uni koddan import qilishingiz mumkin.

Birinchi ilova

Eng oddiy Express ilovasini yozamiz. index.js fayli yarating:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Salom, Express!');
});

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

Ishga tushiring va brauzerda oching:

node index.js

Kodni qadam-baqadam ko'raylik:

  1. express() โ€” yangi ilova (app) obyektini yaratadi;
  2. app.get('/', ...) โ€” bosh sahifaga (/) GET so'rovi kelganda ishlaydigan funksiyani belgilaydi;
  3. res.send(...) โ€” javob jo'natadi;
  4. app.listen(3000) โ€” serverni 3000-portda ishga tushiradi.
app obyekti โ€” bu butun ilovangizning markazi. Unga marshrutlar (routes), middleware'lar va sozlamalar qo'shiladi. An'anaviy ravishda u app deb nomlanadi.

Route (marshrut) nima?

Route (marshrut) โ€” bu "qanday so'rovga qanday javob berish" qoidasi. U ikki qismdan iborat: HTTP metodi (GET, POST...) va manzil (path).

Express'da har bir metod uchun alohida funksiya bor:

app.get('/users', (req, res) => {
  res.send('Foydalanuvchilar ro'yxati');
});

app.post('/users', (req, res) => {
  res.send('Yangi foydalanuvchi qo'shildi');
});

app.get('/about', (req, res) => {
  res.send('Biz haqimizda sahifa');
});

Bir manzilga turli metodlar bilan turli javob berish mumkin. Masalan, /usersga GET so'rovi ro'yxatni qaytaradi, POST so'rovi esa yangisini qo'shadi. Bu REST API'ning asosi (keyingi darsda batafsil).

req obyekti

req (request) obyekti kiruvchi so'rov haqidagi barcha ma'lumotni saqlaydi. Eng ko'p ishlatiladigan xossalari:

app.get('/salom', (req, res) => {
  console.log('Metod:', req.method); // GET
  console.log('URL:', req.url);      // /salom?ism=Ali
  console.log('Query:', req.query);  // { ism: 'Ali' }
  res.send('Salom, ' + req.query.ism);
});

res obyekti: send va json

res (response) obyekti orqali brauzerga javob jo'natasiz. Express bir necha qulay metod beradi:

res.send() โ€” universal javob metodi. U berilgan turga qarab avtomatik ravishda to'g'ri Content-Typeni o'rnatadi:

app.get('/matn', (req, res) => {
  res.send('Oddiy matn'); // text/html
});

app.get('/html', (req, res) => {
  res.send('<h1>Sarlavha</h1>'); // HTML
});

res.json() โ€” maxsus JSON javob uchun. U obyektni avtomatik JSON'ga o'giradi va Content-Type: application/jsonni o'rnatadi. API'larda aynan shu ishlatiladi:

app.get('/api/user', (req, res) => {
  res.json({
    ism: 'Ali',
    yosh: 25,
    faol: true
  });
});
// Brauzerga: {"ism":"Ali","yosh":25,"faol":true}

Boshqa foydali res metodlari:

app.get('/topilmadi', (req, res) => {
  res.status(404).json({ xato: 'Topilmadi' });
});
res.status(...) metodi res obyektini qaytaradi, shuning uchun uni .json() yoki .send() bilan zanjirlab yozish mumkin: res.status(201).json(...).

Har bir so'rovga javob shart

Muhim qoida: har bir route funksiyasi javobni yakunlashi shart โ€” res.send, res.json, res.end yoki shunga o'xshash metod bilan. Aks holda so'rov "osilib" qoladi va brauzer javobni cheksiz kutadi.

Bitta so'rovda javobni ikki marta jo'natib bo'lmaydi. Masalan, res.send(...)dan keyin yana res.send(...) yozsangiz, ERR_HTTP_HEADERS_SENT xatosi chiqadi. Javobdan keyin funksiyadan chiqish uchun ko'pincha return ishlatiladi.

Xulosa