Built-in Middleware — express.json, express.urlencoded

~10 daq · Express · Middleware

Built-in middleware nima?

Express o'zi bir nechta tayyor middleware bilan keladi — alohida o'rnatish shart emas. Ularni express.something() ko'rinishida ishlatiladi.

Asosiy ikki tasi: express.json() va express.urlencoded(). Ikkalasi ham so'rovning body qismini o'qib, req.body ga yuklaydi.


Body nima uchun parse qilish kerak?

HTTP so'rovining body qismi — xom matn (string) sifatida keladi. Node.js uni stream orqali bo'laklarga bo'lib o'qiydi. Bu xom ma'lumotni JavaScript ob'ektiga aylantirish — parsing.

Parse qilinmasa:

app.post('/users', (req, res) => {
  console.log(req.body); // undefined
});

Parse qilinsa:

app.use(express.json());

app.post('/users', (req, res) => {
  console.log(req.body); // { name: 'Ali', email: 'ali@example.com' }
});

express.json() — JSON body uchun

Mijoz Content-Type: application/json header bilan JSON yuborayotganda ishlatiladi. React, Vue, mobil ilovalar — barchasi JSON yuboradi.

app.use(express.json());

Shu bir qator — barcha so'rovlarda JSON body avtomatik parse qilinadi.

// Mijoz yuboradi:
// POST /users
// Content-Type: application/json
// Body: {"name":"Ali","email":"ali@example.com","age":25}

app.post('/users', (req, res) => {
  const { name, email, age } = req.body;
  // name = 'Ali', email = 'ali@example.com', age = 25
  res.status(201).json({ id: Date.now(), name, email, age });
});

Hajm cheklash:

Standart bo'yicha 100 KB gacha body qabul qilinadi. Katta JSON uchun:

app.use(express.json({ limit: '10mb' }));

express.urlencoded() — HTML form uchun

HTML <form> submit qilganda — brauzer Content-Type: application/x-www-form-urlencoded bilan yuboradi. Bu format:

name=Ali&email=ali%40example.com&age=25

express.urlencoded() buni parse qilib req.body ga yuklaydi:

app.use(express.urlencoded({ extended: true }));
<!-- HTML form -->
<form method="POST" action="/users">
  <input name="name" value="Ali" />
  <input name="email" value="ali@example.com" />
  <button type="submit">Yuborish</button>
</form>
app.post('/users', (req, res) => {
  console.log(req.body); // { name: 'Ali', email: 'ali@example.com' }
});

extended: true nima?

extended: false — oddiy ob'ektlar uchun (qs o'rniga querystring ishlatadi). extended: true — ichma-ich ob'ektlar va massivlar uchun (qs ishlatadi).

Zamonaviy loyihalarda extended: true ishlatiladi.


Ikkalasini birga ishlatish

API va HTML form ikkalasini qo'llab-quvvatlash uchun:

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

Express Content-Type header ga qarab to'g'ri parser ni ishlatadi.


express.static() — eslatma

Oldingi darsda ko'rilgan express.static() ham built-in middleware:

app.use(express.static(path.join(__dirname, 'public')));

Tez-tez uchraydigan xatolar

Middleware ni route dan keyin qo'yish:

app.post('/users', (req, res) => {
  console.log(req.body); // undefined!
});

app.use(express.json()); // kech — yuqoridagi route ga ta'sir qilmaydi

Middleware har doim route lardan oldin yoziladi.

JSON bo'lmagan body uchun express.json() kutish:

// Mijoz form yubordi (urlencoded), lekin faqat json middleware bor:
app.use(express.json());

app.post('/form', (req, res) => {
  console.log(req.body); // undefined — urlencoded parse qilinmadi
});

Har ikki middleware ham qo'shiladi.


Xulosa

express.json() — JSON body ni parse qiladi. API larda har doim kerak. express.urlencoded({ extended: true }) — HTML form body ni parse qiladi.

Ikkalasi ham req.body ni to'ldiradi. Route lardan oldin yoziladi.


Keyingi dars

9-dars: Third-party Middleware — morgan, compression, cors