Response metodlari — send, json, status, redirect, download

~15 daq · Express · Kirish va Asoslar

res nima?

res — response ob'ekti. Mijozga javob yuborish uchun. Xuddi pochta xodimi kabi — siz unga nima yuborish kerakligini aytasiz, u yetkazadi.

Express res ob'ektiga ko'plab metodlar qo'shgan. Har birining o'z maqsadi bor.


res.send() — universal javob

res.send() — istalgan turdagi javob yuboradi. String, Buffer, ob'ekt.

res.send('Salom!');                    // text/html
res.send('<h1>Salom!</h1>');           // text/html
res.send({ name: 'Ali' });             // application/json (ob'ekt bo'lsa)
res.send(Buffer.from('baytlar'));      // application/octet-stream

Content-Type ni argument turiga qarab avtomatik belgilaydi.


res.json() — JSON javob

res.json() — ob'ektni JSON ga aylantirib yuboradi. Content-Type: application/json qo'yadi.

res.json({ id: 1, name: 'Ali' });
res.json([1, 2, 3]);
res.json(null);

res.send({ ... }) ham JSON yuboradi, lekin res.json() aniqroq — JSON yuborayotganingizni bildiradi. API larda har doim res.json() ishlatiladi.


res.status() — HTTP status kodi

HTTP status kodi — serverning javob holati. Mijoz bu kodga qarab nima bo'lganini tushunadi.

res.status(200).json({ message: 'OK' });
res.status(201).json(newUser);          // yaratildi
res.status(400).json({ error: 'Noto\'g\'ri so\'rov' });
res.status(401).json({ error: 'Autentifikatsiya kerak' });
res.status(403).json({ error: 'Ruxsat yo\'q' });
res.status(404).json({ error: 'Topilmadi' });
res.status(500).json({ error: 'Server xatosi' });

Eng ko'p ishlatiladigan kodlar:

Kod Ma'nosi Qachon
200 OK Muvaffaqiyatli GET, PUT, PATCH
201 Created Muvaffaqiyatli POST
204 No Content Muvaffaqiyatli DELETE
400 Bad Request Noto'g'ri ma'lumot
401 Unauthorized Login qilinmagan
403 Forbidden Ruxsat yo'q
404 Not Found Topilmadi
409 Conflict Allaqachon mavjud
500 Internal Server Error Server xatosi

Status kodi muhim — frontend va mobil ilovalar unga qarab nima qilishni hal qiladi.


res.status() zanjiri

res.status() res ob'ektini qaytaradi — shuning uchun zanjir hosil qilish mumkin:

// Ikki usul — bir xil natija:
res.status(404).json({ message: 'Topilmadi' });

// yoki
res.status(404);
res.json({ message: 'Topilmadi' });

Birinchi usul — qisqaroq, ko'proq ishlatiladi.


res.redirect() — yo'naltirish

res.redirect() — mijozni boshqa URL ga yo'naltiradi. Brauzer yangi URL ga so'rov yuboradi.

// Standart 302 (vaqtinchalik):
res.redirect('/login');
res.redirect('https://example.com');

// 301 (doimiy):
res.redirect(301, '/new-url');

Qachon kerak? Eski URL yangi URL ga ko'chirilganda, login qilinmagan foydalanuvchini login sahifasiga yuborishda.


res.sendFile() — fayl yuborish

const path = require('path');

app.get('/download/report', (req, res) => {
  const filePath = path.join(__dirname, 'files', 'report.pdf');
  res.sendFile(filePath);
});

sendFile to'liq mutlaq yo'l talab qiladi — __dirname bilan birlashtirish kerak.


res.download() — yuklab olish

res.download() — sendFile ga o'xshash, lekin brauzer faylni ko'rsatish o'rniga yuklab oladi.

app.get('/export/users', (req, res) => {
  const filePath = path.join(__dirname, 'exports', 'users.csv');
  res.download(filePath, 'foydalanuvchilar.csv'); // ikkinchi argument — yuklab olinadigan fayl nomi
});

res.set() — header qo'yish

Ba'zan javobga qo'shimcha header qo'shish kerak:

res.set('X-Request-Id', '12345');
res.set('Cache-Control', 'no-cache');
res.set({
  'Content-Type': 'application/json',
  'X-Powered-By': 'Express',
});

Javob faqat bir marta yuboriladi

Muhim qoida: bir so'rovga faqat bir marta javob yuboriladi. Ikki marta yuborishga urinish — xato:

app.get('/users/:id', (req, res) => {
  const user = users.find(u => u.id === +req.params.id);

  if (!user) {
    res.status(404).json({ message: 'Topilmadi' });
    // return yo'q — kod davom etadi!
  }

  res.json(user); // Xato: Cannot set headers after they are sent
});

return bilan to'xtatish kerak:

if (!user) {
  return res.status(404).json({ message: 'Topilmadi' });
}
res.json(user);

Tez-tez uchraydigan xatolar

return unutish:

Error: Cannot set headers after they are sent to the client

Javob yuborilgandan keyin yana yuborishga urinish. Har bir res.json/send/redirect dan keyin return qo'yish yoki else ishlatish.

Status kodni noto'g'ri ishlatish:

// Xato — yaratish uchun 200 emas, 201:
app.post('/users', (req, res) => {
  res.json(newUser); // 200 qaytaradi
});

// To'g'ri:
res.status(201).json(newUser);

sendFile da nisbiy yo'l:

// Xato:
res.sendFile('files/report.pdf');
// Error: path must be absolute

// To'g'ri:
res.sendFile(path.join(__dirname, 'files', 'report.pdf'));

Xulosa

Metod Nima qiladi
res.send() Universal javob
res.json() JSON javob
res.status(code) Status kodi qo'yish
res.redirect(url) Boshqa URL ga yo'naltirish
res.sendFile(path) Fayl yuborish
res.download(path) Fayl yuklab olish
res.set(header, val) Header qo'yish

Har bir so'rovga faqat bir marta javob yuboriladi — return unutilmaydi.


Keyingi dars

6-dars: Static fayllar — express.static, papka sozlash