Mundarija (21)
- Bu darsda
- 1. Nega bu kerak?
- 2. 2xx — muvaffaqiyat
- 3. 3xx — yo'naltirish
- 3.1 Beshta yo'naltirish
- 3.2 304 — keshdagisi yangi
- 4. 4xx — mijoz xatosi
- 4.1 400 va 422
- 4.2 Boshqa 4xx kodlar
- 4.3 429 va Retry-After
- 5. 5xx — server xatosi
- 6. API qadami: status kodlar jadvali (holat 22, 3-qism)
- 7. Ko'p uchraydigan xatolar
- 8. Mashqlar
- 1-mashq (oson): kodni tanlang
- 2-mashq (o'rta): javobni tasniflash
- 3-mashq (qiyin): 405 + Allow ni node:http da
- 4-mashq: API qadami
- 9. Real ishda
- Xulosa
- Manbalar
HTTP status kodlari: 201, 204, 400 va 422, 409, 429 — qaysi birini tanlash
Qisqacha: Status kod — javobning birinchi va eng qisqa xabari. Yaratildi — 201 va
Locationsarlavhasi, tanasiz muvaffaqiyat — 204. Mijoz xatosi — 4xx: buzuq JSON 400, tushunarli, lekin qoidaga zid ma'lumot 422, yo'q resurs 404, noto'g'ri metod 405 vaAllow, ziddiyat 409, noto'g'riContent-Type415, juda ko'p so'rov 429 vaRetry-After. Server xatosi — 5xx. Yo'naltirishda 307/308 metodni saqlaydi, 301/302 esa POST'ni GET'ga aylantiradi — biz tekshirdik.
Bu darsda
- Muvaffaqiyat kodlarini (200, 201, 202, 204) to'g'ri tanlaysiz va
Locationqo'yasiz. - 301, 302, 303, 307, 308 farqini haqiqiy natija bilan bilasiz.
- 400 va 422, 401 va 403, 404 va 410 farqini tushuntira olasiz.
- 409, 415, 429, 503 va
Retry-Afterni qachon ishlatishni bilasiz. vazifalar-apining to'liq status kodlar jadvalini tekshirasiz.
Oldin bilishingiz kerak: HTTP metodlari va status kodlari, HTTP metodlari semantikasi, res obyekti.
1. Nega bu kerak?
Mijoz — frontend, mobil ilova yoki boshqa server — javobni o'qishdan oldin status kodga qaraydi. Uning keyingi harakati shu bitta raqamga bog'liq:
- 2xx — muvaffaqiyat, natijani ko'rsat.
- 4xx — mijoz xatosi, foydalanuvchiga ayt, qayta yuborma (o'zgartirmaguncha).
- 5xx — server xatosi, keyinroq qayta urinish mumkin.
- 429, 503 — kut va qayta urin.
Agar server hamma narsaga 200 qaytarib, tanasida {"xato": "topilmadi"} yozsa, nima bo'ladi? fetch res.ok ni true deydi (fetch darsi). Kesh xato javobni saqlab qoladi. Monitoring "hammasi joyida" ko'rsatadi. Qayta urinish mexanizmi nima qilishni bilmaydi.
O'xshatish: svetofor. Uchta rang butun chorrahani boshqaradi. Haydovchi har mashina bilan gaplashmaydi — rangga qaraydi. Status kod — API'ning svetofori.
2. 2xx — muvaffaqiyat
| Kod | Nomi | Qachon |
|---|---|---|
| 200 | OK | Tanali muvaffaqiyat: GET, PUT, PATCH natijasi |
| 201 | Created | Yangi resurs yaratildi; Location — uning manzili |
| 202 | Accepted | Qabul qilindi, lekin hali bajarilmadi (fon ishi) |
| 204 | No Content | Muvaffaqiyat, tana yo'q: DELETE |
201 va Location. POST yangi resurs yaratganda mijoz uning manzilini bilishi kerak. Holat 22 da biz yubordik:
POST /vazifalar → 201 location: /vazifalar/1 {"id":1,"matn":"Non olish #uy",…}Location sarlavhasi frontend'ga ID'ni tanadan qidirmasdan olish imkonini beradi. CORS bilan u faqat exposedHeaders da bo'lsa ko'rinadi (Mashhur middleware'lar). Kodda — bitta zanjir:
res.status(201).location(`${req.baseUrl}/${String(v.id)}`).json(v);204 — tanasiz. DELETE /vazifalar/1 → 204. Tana yozish taqiqlanadi: Express 204 da tanani o'zi tashlab yuboradi. Frontend'da res.json() chaqirsangiz, bo'sh tana SyntaxError beradi — 204 da tanani o'qimang.
202 — keyin bajariladi. "Hisobotni tayyorlash 2 daqiqa oladi" — server darhol 202 va kuzatish manzilini qaytaradi. Bu Bulk va uzoq operatsiyalar darsida.
3. 3xx — yo'naltirish
3.1 Beshta yo'naltirish
| Kod | Doimiymi | Metod saqlanadimi |
|---|---|---|
| 301 Moved Permanently | ha | POST → GET bo'lishi mumkin |
| 302 Found | yo'q | POST → GET bo'lishi mumkin |
| 303 See Other | yo'q | doim GET |
| 307 Temporary Redirect | yo'q | saqlanadi |
| 308 Permanent Redirect | ha | saqlanadi |
| 304 Not Modified | — | yo'naltirish emas: "keshdagisi yangi" |
"Bo'lishi mumkin" — tarixiy sabab. Brauzerlar 301/302 da POST'ni GET'ga aylantirgan, standart buni keyin qonuniylashtirgan. 307 va 308 shu noaniqlikni tuzatish uchun qo'shilgan.
Buni o'z ko'zingiz bilan ko'ring. Quyidagi blok lokal server ochadi: /eski-NNN — NNN kodi bilan /yangi ga yo'naltiradi, /yangi esa kelgan metod va tana hajmini aytadi. fetch har kodga POST yuboradi va yo'naltirishga o'zi ergashadi. Chiqishda har qatorga qarang: /yangi ga qaysi metod va necha bayt tana yetib keldi? Blok Node uchun — o'z terminalingizda ishga tushiring:
import { createServer } from "node:http";
const server = createServer((req, res) => {
const m = req.url.match(/^\/eski-(\d{3})$/);
if (m) {
res.writeHead(Number(m[1]), { location: "/yangi" });
return res.end();
}
let hajm = 0;
req.on("data", (b) => { hajm += b.length; });
req.on("end", () => res.end(`${req.method}, tana ${hajm} bayt`));
});
await new Promise((ok) => server.listen(0, "127.0.0.1", ok));
const A = `http://127.0.0.1:${server.address().port}`;
for (const kod of [301, 302, 303, 307, 308]) {
const r = await fetch(`${A}/eski-${kod}`, {
method: "POST", body: '{"matn":"Non"}',
});
console.log(`${kod} → ${await r.text()}`);
}
server.closeAllConnections();
server.close();Konsolda:
301 → GET, tana 0 bayt
302 → GET, tana 0 bayt
303 → GET, tana 0 bayt
307 → POST, tana 14 bayt
308 → POST, tana 14 baytNima bo'ldi? 301 va 302 da yangi vazifa jim yo'qoldi: fetch POST'ni GET'ga aylantirdi va tanani tashladi. 303 ham shunday qildi — lekin u buni ochiq va'da qiladi. Server "200 OK" qaytardi, mijoz hech narsa sezmadi. Shuning uchun API'da:
- Endpoint doimiy ko'chdi (
/v1/vazifalar→/v2/vazifalar) — 308. - Vaqtinchalik — 307.
- "POST'dan keyin natija sahifasiga o't" (HTML forma) — 303.
Express'da res.redirect(url) sukut bo'yicha 302 beradi. Kod kerak bo'lsa: res.redirect(308, url). Eslatma: res.redirect("back") Express 5 da olib tashlangan (Express 5 darsi).
3.2 304 — keshdagisi yangi
Mijoz If-None-Match: <ETag> yuboradi. Resurs o'zgarmagan bo'lsa, server tanasiz 304 qaytaradi va trafik tejaladi. Express buni ETag bilan o'zi qiladi. Kanondagi tuzoq: Node fetch (undici) shartli sarlavha bor so'rovga o'zi Cache-Control: no-cache qo'shadi. Shuning uchun Express 200 beradi; curl bilan esa 304. Tafsiloti — HTTP caching darsida.
Tekshirib ko'ring: Siz
POST /vazifaniPOST /vazifalarga ko'chirdingiz va eski manzilgares.redirect(301, "/vazifalar")qo'ydingiz. Eski mobil ilova nima ko'radi?
Javob
Ko'p mijozlar 301 dan keyin GET /vazifalar yuboradi — tanasiz. Ilova vazifa yaratildi deb o'ylaydi (javob 200, ro'yxat keldi), lekin vazifa yaratilmagan. To'g'risi — 308: metod va tana saqlanadi. Yoki eski manzilda bir muddat to'liq ishlovchi qoldirish.
4. 4xx — mijoz xatosi
4.1 400 va 422
Ikkalasi ham "so'rov noto'g'ri", lekin har xil bosqichda:
- 400 Bad Request — so'rovni o'qib bo'lmadi: JSON buzuq, query parametri noto'g'ri formatda,
idraqam emas. - 422 Unprocessable Content — so'rov o'qildi, shakli to'g'ri, lekin mazmuni qoidaga zid: matn bo'sh, noma'lum maydon, PUT'da
bajarildiyo'q.
Biz holat 22 ga yubordik:
POST buzuq JSON → 400 {"xato":"Tana yaroqli JSON emas"}
POST matn bo'sh → 422 {"xato":"matn 1–200 belgi bo'lishi kerak"}
POST ortiqcha → 422 {"xato":"noma'lum maydon: id"}(Holat 22 da chegara hali 200 belgi; kanon qarori bilan keyinroq — holat 40 da — 100 ga tushadi, frontend'dagi chegara bilan bir xil.)
O'xshatish: pochta. 400 — konvertdagi manzil o'qib bo'lmaydigan darajada xira. 422 — manzil aniq, lekin xatda imzo yo'q.
Ba'zi API'lar hamma narsaga 400 ishlatadi — bu ham qabul qilingan uslub. Muhimi — bitta API ichida izchil bo'lish. vazifalar-api qoidasi: tahlil (parse) xatosi — 400, validatsiya — 422.
4.2 Boshqa 4xx kodlar
| Kod | Ma'nosi | vazifalar-api misoli |
|---|---|---|
| 401 Unauthorized | Kimligingiz noma'lum (kirmagansiz) | auth qismida |
| 403 Forbidden | Kimligingiz ma'lum, lekin ruxsat yo'q | auth qismida |
| 404 Not Found | Resurs yo'q | Vazifa 999 topilmadi |
| 405 Method Not Allowed | URI bor, metod yo'q; Allow majburiy |
POST /vazifalar/1 |
| 409 Conflict | Joriy holat bilan ziddiyat | Ro'yxat to'lgan (1000) |
| 410 Gone | Bor edi, butunlay o'chirildi | eski API versiyasi |
| 413 Content Too Large | Tana juda katta | 16 KB dan katta |
| 415 Unsupported Media Type | Content-Type noto'g'ri |
text/plain |
| 429 Too Many Requests | Juda ko'p so'rov; Retry-After |
rate limit |
Ba'zi juftlarni ajratamiz:
401 va 403. Nomi chalg'itadi: 401 "Unauthorized", lekin ma'nosi "autentifikatsiya yo'q" — siz kimligingizni aytmadingiz. 403 — "bilaman kimligingizni, lekin bu sizga mumkin emas". 401 javobida WWW-Authenticate sarlavhasi bo'lishi kerak.
404 va 403 — maxfiylik uchun. Begona foydalanuvchining vazifasini so'ragan odamga 403 bersangiz, "bunday vazifa bor" deb aytgan bo'lasiz. Ko'p API'lar bunday holatda 404 qaytaradi — mavjudlikni ham yashiradi.
405 va Allow. Kanon topilmasi: Express noto'g'ri metodga o'zi 404 beradi (HTML "Cannot POST"), 405 emas (holat 13). Shuning uchun marshrut oxiriga .all(metodYoq(...)) qo'yilgan. Holat 22 da:
POST /vazifalar/1 → 405 allow: GET, HEAD, PUT, PATCH, DELETE {"xato":"POST bu manzilda yo'q"}409 — ziddiyat. So'rov o'zi to'g'ri, lekin serverdagi joriy holat bilan sig'maydi. Biz 1000 ta vazifa yaratib, 1001-chisini yubordik:
POST 1001-chi → 409 {"xato":"Ro'yxat to'lgan (1000)"}Boshqa 409 misollari: "bu login band", "bu versiya allaqachon o'zgargan".
415. Server Content-Type: text/plain bilan kelgan JSON'ni o'qimaydi (Express 5 tuzog'i — req.body undefined):
POST text/plain → 415 {"xato":"Content-Type: application/json bo'lishi kerak"}4.3 429 va Retry-After
Retry-After — "shuncha vaqtdan keyin qayta urining". Qiymati ikki xil bo'lishi mumkin (RFC 9110): soniyalar soni (60) yoki HTTP sana (Sat, 24 Oct 2026 10:00:00 GMT). Rate-limit tajribasida Retry-After: 60 keldi. Mijoz ikkala shaklni ham tushunishi kerak. «Ishga tushir» bilan sinang:
function kutishMs(retryAfter, hozir = Date.now()) {
if (retryAfter === null) return null;
if (/^\d+$/.test(retryAfter)) return Number(retryAfter) * 1000;
const sana = Date.parse(retryAfter);
// tushunarsiz qiymat — o'z siyosatingiz
if (Number.isNaN(sana)) return null;
return Math.max(0, sana - hozir);
}
const hozir = Date.parse("Sat, 24 Oct 2026 10:00:00 GMT");
console.log(kutishMs("60", hozir));
console.log(kutishMs("Sat, 24 Oct 2026 10:02:30 GMT", hozir));
console.log(kutishMs("Sat, 24 Oct 2026 09:00:00 GMT", hozir));
console.log(kutishMs("ertaga", hozir), kutishMs(null, hozir));Konsolda:
60000
150000
0
null nullUchinchi qatorga qarang: o'tib ketgan sana — 0, darhol urinish mumkin. Manfiy kutish bo'lmaydi.
Tekshirib ko'ring: Foydalanuvchi
{"matn": ""}yubordi. Hamkasbingiz 400, siz 422 deysiz. Ikkalangiz ham to'g'rimi? Va{"matn": "Non"(yopilmagan qavs) uchun-chi?
Javob
Birinchisida ikkala uslub ham uchraydi — muhimi API bo'ylab izchillik. vazifalar-api qoidasi bo'yicha 422: JSON to'g'ri o'qildi, mazmun qoidaga zid. Ikkinchisida — faqat 400: JSON'ni o'qib bo'lmadi, mazmun haqida gapirib bo'lmaydi.
5. 5xx — server xatosi
| Kod | Kim qaytaradi | Ma'nosi |
|---|---|---|
| 500 Internal Server Error | Ilovaning o'zi | Kutilmagan xato (bug) |
| 502 Bad Gateway | Proxy (nginx) | Orqadagi server noto'g'ri javob berdi yoki ulanish uzildi |
| 503 Service Unavailable | Ilova yoki proxy | Vaqtincha ishlamayapti; Retry-After bilan |
| 504 Gateway Timeout | Proxy | Orqadagi server vaqtida javob bermadi |
Qoida: 500 — sizning xatongiz. Mijozning ma'lumoti qanchalik yomon bo'lmasin, unga 500 qaytarish — tekshiruv yetishmayotganini bildiradi. Kanonda shunday holat bo'lgan: Range: bytes=99999- so'roviga 500 chiqqan — aslida 416 bo'lishi kerak edi (holat 13).
500 javobida ichki tafsilot (stack, SQL, fayl yo'li) ko'rsatilmaydi. vazifalar-api tanaga faqat {"xato":"Server xatosi"} yozadi, tafsilot — [sorovId] bilan logga (Express + TypeScript).
502 va 504 ni ko'pincha Node emas, oldidagi proxy qaytaradi (reverse proxy darsi). Node yiqilgan bo'lsa — 502; javob proxy_read_timeout dan uzoq cho'zilsa — 504.
flowchart TD
A["Xato bormi?"] -- "yo'q" --> B{"Yangi resurs?"}
B -- "ha" --> B1["201 + Location"]
B -- "yo'q" --> B2["200 yoki 204"]
A -- "ha" --> C{"Kim aybdor?"}
C -- "mijoz" --> D{"O'qib bo'ldimi?"}
D -- "yo'q" --> D1["400 / 413 / 415"]
D -- "ha" --> D2["404 / 405 / 409 / 422"]
C -- "server" --> E["500 / 503"]Diagrammani chap yuqoridan pastga kuzating. Har javobdan oldin ikki savol: "kim aybdor?" va "so'rovni o'qib bo'ldimi?". Shu ikki savol kodlarning ko'pini ajratadi.
6. API qadami: status kodlar jadvali (holat 22, 3-qism)
Bu qismda kod deyarli o'zgarmaydi — holat 22 dagi status kodlar jadvali tekshiriladi. Hali commit qilmang.
| Metod va yo'l | Muvaffaqiyat | Xatolar |
|---|---|---|
GET /vazifalar |
200 + Link |
400 |
POST /vazifalar |
201 + Location |
400, 409, 413, 415, 422 |
GET/HEAD /vazifalar/:id |
200 | 400, 404 |
PUT /vazifalar/:id |
200 | 400, 404, 415, 422 |
PATCH /vazifalar/:id |
200 | 400, 404, 415, 422 |
DELETE /vazifalar/:id |
204 | 400, 404 |
| boshqa metod | — | 405 + Allow |
GET /teglar |
200 | 405 |
Bitta o'zgarish — 409 tekshiruvi. Holat 17 da xizmat sonni bilish uchun butun ro'yxatni o'qirdi:
-if ((await ombor.royxat({})).length >= MAKS_VAZIFA) throw …
+if ((await ombor.soni({})) >= MAKS_VAZIFA) throw new HttpXato(409, …Omborga soni(filtr) metodi qo'shildi. 1000 ta vazifani xotiraga olib, length ni o'qish — isrof. Postgres'da bu SELECT count(*) bo'ladi (SQL qismi). Ro'yxat formati ham o'zgaradi (sahifalash) — royxat({}).length umuman ishlamay qoladi.
7. Ko'p uchraydigan xatolar
| Xato | Oqibat | To'g'risi |
|---|---|---|
Hamma narsaga 200 + {"xato"} |
res.ok aldaydi, kesh xatoni saqlaydi |
To'g'ri 4xx/5xx |
POST → 200, Location yo'q |
Mijoz yangi manzilni bilmaydi | 201 + Location |
| 204 bilan tana | Tana tashlanadi, mijoz json() da yiqiladi |
204 — tanasiz |
| Validatsiya xatosiga 500 | Monitoring "server buzildi" deydi | 400/422 |
| 301 bilan POST yo'naltirish | Tana yo'qoladi | 308 |
| 401 va 403 almashgan | Mijoz noto'g'ri harakat qiladi | 401 — kirish, 403 — ruxsat |
| 405 o'rniga 404 | Mijoz manzil xato deb o'ylaydi | .all() + Allow |
8. Mashqlar
Yechimlar kurs/mashqlar/25/20-status-kodlar/ da.
1-mashq (oson): kodni tanlang
- Yangi buyurtma yaratildi —
- Buyurtma o'chirildi, javob tanasiz —
- JSON'da qavs yopilmagan —
- Bu login allaqachon band —
- Kirmagan foydalanuvchi profilni so'radi —
Yechim
- 201 —
Location: /buyurtmalar/17bilan. - 204 — DELETE, tana yo'q.
- 400 — tana o'qilmadi.
- 409 — joriy holat bilan ziddiyat.
- 401 — kimligi noma'lum; ruxsat yo'q bo'lsa 403.
2-mashq (o'rta): javobni tasniflash
javobniTasnifla(res) funksiyasini yozing — res — fetch qaytaradigan Response (status va sarlavhalar uning ichida). U mijoz nima qilishi kerakligini qaytarsin: "natija" (2xx, 204 dan tashqari), "bosh" (204), "qayta-urin <ms>" (429 va 503 — Retry-After dan, bo'lmasa 1000 ms), "qayta-urin 1000" (502, 504), "xato" (boshqa 4xx/5xx). Soxta Response obyektlari bilan sinang: new Response(null, { status: 429, headers: { "retry-after": "5" } }). Yordam: kutishMs — «429 va Retry-After» bo'limida; Response — Request va Response darsi.
Yechim
function kutishMs(retryAfter, hozir = Date.now()) {
if (retryAfter === null) return null;
if (/^\d+$/.test(retryAfter)) return Number(retryAfter) * 1000;
const sana = Date.parse(retryAfter);
return Number.isNaN(sana) ? null : Math.max(0, sana - hozir);
}
function javobniTasnifla(res) {
if (res.status === 204) return "bosh";
if (res.ok) return "natija";
if (res.status === 429 || res.status === 503) {
const ms = kutishMs(res.headers.get("retry-after")) ?? 1000;
return `qayta-urin ${ms}`;
}
if (res.status === 502 || res.status === 504) {
return "qayta-urin 1000";
}
return "xato";
}
const javoblar = [
new Response('{"id":1}', { status: 201 }),
new Response(null, { status: 204 }),
new Response(null, {
status: 429, headers: { "retry-after": "5" },
}),
new Response(null, { status: 503 }),
new Response('{"xato":"…"}', { status: 422 }),
new Response(null, { status: 504 }),
];
for (const r of javoblar) console.log(r.status, javobniTasnifla(r));Konsolda:
201 natija
204 bosh
429 qayta-urin 5000
503 qayta-urin 1000
422 xato
504 qayta-urin 1000422 — qayta urinilmaydi: ma'lumot o'zgarmasa, natija ham o'zgarmaydi. Bu toza funksiya — test yozish oson (fetch darsidagi qayta urinish bilan birlashtiring).
3-mashq (qiyin): 405 + Allow ni node:http da
Express'siz node:http server yozing: /vazifalar — GET va POST, /vazifalar/1 — GET va DELETE. Boshqa metodga — 405, Allow sarlavhasi va JSON xato; noma'lum yo'lga — 404. HEAD'ni GET bilan bir qatorda qo'llang (tanasiz). listen(0) bilan ishga tushirib, fetch bilan to'rt so'rov yuboring: GET /vazifalar, PUT /vazifalar, HEAD /vazifalar/1, GET /yoq. Oxirida close(). Yordam: qo'lda routing darsi.
Yechim
import { createServer } from "node:http";
const MARSHRUTLAR = {
"/vazifalar": ["GET", "HEAD", "POST"],
"/vazifalar/1": ["GET", "HEAD", "DELETE"],
};
const server = createServer((req, res) => {
const ruxsat = MARSHRUTLAR[req.url];
const json = (holat, tana, sarlavha = {}) => {
res.writeHead(holat, { "content-type": "application/json",
...sarlavha });
res.end(req.method === "HEAD" ? undefined : JSON.stringify(tana));
};
if (!ruxsat) return json(404, { xato: `${req.url} topilmadi` });
if (!ruxsat.includes(req.method)) {
return json(405, { xato: `${req.method} bu manzilda yo'q` },
{ allow: ruxsat.join(", ") });
}
json(200, { yol: req.url, metod: req.method });
});
await new Promise((ok) => server.listen(0, "127.0.0.1", ok));
const A = `http://127.0.0.1:${server.address().port}`;
const sorovlar = [["GET", "/vazifalar"], ["PUT", "/vazifalar"],
["HEAD", "/vazifalar/1"], ["GET", "/yoq"]];
for (const [metod, yol] of sorovlar) {
const r = await fetch(A + yol, { method: metod });
const allow = r.headers.get("allow") ?? "-";
const qator = [metod, yol, r.status, allow, await r.text()];
console.log(qator.filter((x) => x !== "").join(" "));
}
server.closeAllConnections();
server.close();Konsolda:
GET /vazifalar 200 - {"yol":"/vazifalar","metod":"GET"}
PUT /vazifalar 405 GET, HEAD, POST {"xato":"PUT bu manzilda yo'q"}
HEAD /vazifalar/1 200 -
GET /yoq 404 - {"xato":"/yoq topilmadi"}HEAD javobining tanasi bo'sh — fetch uni bo'sh satr qilib beradi.
4-mashq: API qadami
Omborga soni(filtr): Promise<number> qo'shing (XotiraOmbori da — filtrla(...).length), xizmatdagi 409 tekshiruvini unga o'tkazing. "Status kodlar jadvali"dagi har qatorga kamida bitta test borligini tekshiring; yo'g'ini qo'shing (masalan, 1001-vazifa → 409 — MAKS_VAZIFA ni testda kichik qilib). Commit qilmang.
Yechim
// xotira-ombor.ts
soni(filtr: Filtr): Promise<number> {
return Promise.resolve(filtrla([...this.#vazifalar.values()], filtr)
.length);
}
// xizmat.ts
async yarat(yangi: YangiVazifa): Promise<Vazifa> {
if ((await ombor.soni({})) >= MAKS_VAZIFA) {
const xabar = `Ro'yxat to'lgan (${String(MAKS_VAZIFA)})`;
throw new HttpXato(409, xabar);
}
return ombor.yarat(yangi);
},409 testi uchun 1000 ta POST sekin emas (xotirada), lekin MAKS_VAZIFA ni xizmat parametriga aylantirish testni tezlashtiradi — bu sizning tanlovingiz, kanonda konstanta.
9. Real ishda
- Frontend bilan shartnoma.
vazifalarfrontend'i 422 da maydon xatosini, 409 da "ro'yxat to'lgan" xabarini, 5xx da "keyinroq urinib ko'ring" ni ko'rsatadi. Status kod — ikki jamoa orasidagi til. - Monitoring. Grafana/Sentry'da 5xx ulushi — asosiy signal. Validatsiya xatolariga 500 qaytarish bu signalni "shovqin"ga aylantiradi.
- Intervyu: "401 va 403 farqi?", "PUT 200 yoki 204 qaytaradimi?", "301 va 308 farqi?".
Xulosa
- 201 +
Location— yaratildi; 204 — tanasiz; 202 — keyin bajariladi. - 301/302 POST'ni GET'ga aylantiradi (biz ko'rdik: tana 0 bayt), 307/308 — metod va tana saqlanadi.
- 400 — o'qib bo'lmadi, 422 — mazmun noto'g'ri; 405 —
Allowbilan (Express o'zi bermaydi); 409 — holat bilan ziddiyat; 415 —Content-Type. - 429/503 +
Retry-After(soniya yoki sana); 500 — sizning xatongiz, tafsilot logga. vazifalar-apijadvali — har kod uchun test.
Keyingi dars: Filtrlash, saralash va maydon tanlash — ?teg=uy&sort=-yaratildi&fields=matn va oq ro'yxat.
Manbalar
- RFC 9110 — HTTP Semantics: status kodlar, Location va Retry-After sarlavhalari: https://www.rfc-editor.org/rfc/rfc9110 (2022-06)
- MDN — HTTP response status codes: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status (2026-10-24)
- Kanon: holat 22 (status jadvali,
soni),tekshiruv-22, holat 13 topilmalari (Express 405 bermaydi, 416 → 500). Holat 22 javoblari va yo'naltirish tajribasi — biz ishga tushirdik (Node 24.21.0).
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!