Response metodlari — send, json, status, redirect, download
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