IlmHamroh
JavaScript Full-stack/25-qism. HTTP, Express va REST API15/51-dars15 daqiqa
Mundarija (21)

Express 5: async xatolar, yangi route sintaksisi va 4 dan ko'chish

Qisqacha: Express 5 async ishlovchidagi throw ni va rad etilgan Promise'ni o'zi xato middleware'iga yuboradi — Express 4 da esa so'rov osilib qolardi. Marshrut (route) naqshlari path-to-regexp 8 ga o'tdi: * o'rniga /*splat, :id? o'rniga {/:id}, naqsh ichida regex yo'q. Eski naqsh endi ilova ishga tushganda PathError beradi. app.del, req.param, res.redirect("back") olib tashlandi, express-async-errors paketi esa kerak emas.

Bu darsda

  • Express 5 async xatoni qanday ushlashini va qaysi xatoni ushlay olmasligini bilasiz.
  • Yangi route sintaksisini yozasiz: /*splat, {/:ixtiyoriy}, \\( bilan qochirish.
  • Express 4 dagi naqshni 5 ga o'tkaza olasiz va PathError xabarini o'qiysiz.
  • 4 → 5 ko'chishdagi boshqa buzilishlarni (status, redirect("back"), req.body) taniysiz.

Oldin bilishingiz kerak: Express'ga kirish va Express 5, Middleware va request lifecycle, Mashhur middleware'lar, async / await.

1. Nega bu kerak?

Internetdagi Express maqolalarining ko'pi Express 4 uchun yozilgan. Express 4 o'n yil davomida asosiy versiya bo'ldi. Express 5.0.0 esa 2024 yil sentyabrida chiqdi, npm'dagi latest belgisini 2025 yil 31 martda 5.1.0 bilan oldi (Express jamoasi blogiga ko'ra). Natijada Stack Overflow'dan olingan kod Express 5 da ikki xil buziladi:

  1. Ilova umuman ishga tushmaydi — eski route naqshi xato beradi.
  2. Ilova ishlaydi, lekin boshqacha — masalan, res.redirect("back") endi "orqaga" emas, back degan manzilga yo'naltiradi.

Bu ko'chish yangi uyga o'tishga o'xshaydi: mebelning ko'pi joyiga sig'adi, lekin ba'zi eshiklar torroq. Qaysi buyum sig'masligini oldindan bilsangiz, ko'chish bir kunda tugaydi. Bilmasangiz — buyum eshikda tiqilib qoladi.

Bu darsda ikki katta o'zgarishni chuqur ko'ramiz: async xatolar va route sintaksisi. Keyin qolgan mayda buzilishlar ro'yxati keladi. Barcha natijalar — haqiqiy: kanon Express 4.22.3 va 5.3.0 ni yonma-yon sinagan (t15), qolganini biz ishga tushirdik.

2. Async xatolar

2.1 Express 4 dagi muammo

Middleware darsida ko'rgansiz: ishlovchi (handler) ichida throw bo'lsa, Express xatoni 4 argumentli xato middleware'iga uzatadi. Lekin Express 4 buni faqat sinxron throw uchun qilardi. async funksiya throw qilsa, xato rad etilgan Promise ichida qoladi. Express 4 ishlovchi qaytargan qiymatga qaramaydi — Promise'ni ko'rmaydi.

Kanon bir xil kodni ikki versiyada ishga tushirgan:

js
app.get("/async", async () => {
  throw new Error("async xato");
});
app.use((err, req, res, next) => {
  res.status(500).json({ ushlandi: err.message });
});
Express 4.22.3 Express 5.3.0
GET /async 2 s ichida javob yo'q — so'rov osilib qoldi 500 {"ushlandi":"async xato"}
Jarayonda unhandledRejection: async xato hech narsa

Express 4 da mijoz javob kutib qoladi, Node esa "ushlanmagan rad etish" (unhandled rejection) haqida ogohlantiradi. Bu muammo uchun ikkita mashhur yamoq bor edi: har ishlovchini try/catch ga o'rash yoki express-async-errors paketi. Express 5 da ikkalasi ham kerak emas.

2.2 Express 5 ichida nima bo'ladi

Express 5 ning routeri ishlovchi qaytargan qiymatga qaraydi. Agar u Promise bo'lsa va rad etilsa, xato next(err) ga ketadi. Buni oddiy JS bilan modellashtiramiz — quyidagi blok haqiqiy Express emas, uning g'oyasi. «Ishga tushir» bilan sinang:

js
// Express 5 routerining soddalashtirilgan modeli
function chaqir(handler, next) {
  try {
    const natija = handler(next);
    if (natija && typeof natija.then === "function") {
      natija.then(undefined, (err) => next(err)); // rad etilsa
    }
  } catch (err) {
    next(err); // sinxron throw
  }
}

const xatoMw = (nom) => (err) =>
  console.log(`${nom} → ushlandi: ${err.message}`);

chaqir(() => { throw new Error("sinxron"); }, xatoMw("sync"));
chaqir(async () => { throw new Error("async"); }, xatoMw("async"));
chaqir(() => Promise.reject(new Error("promise")), xatoMw("promise"));
chaqir(async (next) => {
  next(new Error("next(err)"));
}, xatoMw("next"));

Konsolda:

text
sync → ushlandi: sinxron
next → ushlandi: next(err)
async → ushlandi: async
promise → ushlandi: promise

Tartibga qarang: sync va next darhol, async va promise esa keyinroq chiqdi. Promise rad etilishi microtask navbatida ishlaydi (event loop darsi). Ma'nosi bir xil — to'rttala usulda xato xato middleware'iga yetdi.

Biz buni haqiqiy Express 5.3.0 da ham sinadik: sinxron throw, await dan keyingi throw (middleware ichida ham) va rad etilgan Promise qaytarish — uchalasi 500 va xato middleware'idagi xabarni berdi.

2.3 Express 5 ham ushlay olmaydigan xato

Bitta holat qoldi — xato callback ichida, Promise zanjiridan tashqarida:

js
app.get("/taymer", (req, res) => {
  setTimeout(() => {
    throw new Error("taymer ichida xato");
  }, 10);
});

Biz ishga tushirdik (express 5.3.0, Node 24.21.0) — xato middleware'i chaqirilmadi, butun jarayon yiqildi:

text
Error: taymer ichida xato
jarayon tugadi, exit kod 1

Nega? setTimeout callback'i ishlovchi tugagandan keyin, event loop'ning boshqa aylanishida ishlaydi (timers darsi). U paytda Express'ning try/catch i ham, Promise'i ham yo'q. Xato hech kimga tegishli emas — Node jarayonni to'xtatadi. Bitta foydalanuvchining so'rovi butun serverni o'chirdi.

Davosi — callback'ni Promise'ga aylantirish. node:timers/promises dagi setTimeout (timers darsi) yoki fs/promises kabi Promise API'lar:

js
import { setTimeout as kut } from "node:timers/promises";

app.get("/taymer", async (req, res) => {
  await kut(10);
  throw new Error("taymer ichida xato"); // endi Express ushlaydi
});

Qoida: ishlovchi ichida callback uslubidagi API ishlatmang. Eski kutubxona faqat callback bersa — util.promisify (util darsi).

Tekshirib ko'ring: Express 5 da quyidagi ishlovchi xatoni ushlaydimi? app.get("/x", (req, res) => { fetch(url).then(() => { throw new Error("!"); }); });

Javob

Yo'q. Ishlovchi Promise'ni qaytarmayapti — fetch(...).then(...) zanjiri yaratiladi, lekin return yo'q. Express ishlovchidan undefined oladi va Promise'ni ko'rmaydi. Xato ushlanmagan rad etish bo'ladi, mijoz esa javob kutib qoladi. Tuzatish: async + await fetch(url) yoki return fetch(url).then(...).

3. Yangi route sintaksisi (path-to-regexp 8)

3.1 Nima o'zgardi

Express route naqshlarini (masalan /vazifalar/:id) path-to-regexp kutubxonasi regex'ga aylantiradi. Express 5 da u 0.1 versiyadan 8 ga sakradi (express 5.3.0 → router 2.2.0 → path-to-regexp 8.4.2). Yangi versiya naqsh ichidagi regex imkoniyatlarini olib tashladi. Sabab — xavfsizlik: naqshdagi regex ReDoS hujumiga yo'l ochardi (RegExp tuzoqlari).

Kanon t15 natijasi — eski naqshlar Express 5 da:

Naqsh (Express 4) Express 5.3.0 Yangi yozuv
/fayl/* PathError: Missing parameter name at index 7 /fayl/*splat
/v/:id? PathError: Unexpected ? at index 6 /v{/:id}
/ab(cd)? PathError: Unexpected ( at index 3 ikki marshrut yoki /ab{cd}
/:nomi.:ext ishlaydi o'zgarmaydi

Xabarni o'qishni o'rganing. Missing parameter name at index 7 — "7-pozitsiyada parametr nomi yo'q". /fayl/* da 7-belgi — *: yangi sintaksisda yulduzcha ham nomli parametr, nomi esa yozilmagan. Unexpected ? at index 6 — "6-pozitsiyada kutilmagan ?". Har xabar oxirida visit https://git.new/pathToRegexpError for info havolasi bor.

Xato ilova ishga tushganda, app.get(...) chaqirilgan joyda chiqadi — birinchi so'rovda emas. Bu yaxshi: buzuq naqsh prod'ga yashirincha chiqib ketmaydi. Xatoning turi — PathError (u TypeError dan meros oladi).

3.2 Yangi sintaksis — biz sinagan misollar

Biz express 5.3.0 da sakkizta naqshni sinadik:

text
GET /fayl/a/b.txt   → 200 {"naqsh":"/fayl/*splat","params":{"splat":["a","b.txt"]}}
GET /fayl           → 404
GET /rasm           → 200 {"naqsh":"/rasm{/*yol}","params":{}}
GET /rasm/x/y.png   → 200 {"naqsh":"/rasm{/*yol}","params":{"yol":["x","y.png"]}}
GET /v              → 200 {"naqsh":"/v{/:id}","params":{}}
GET /v/7            → 200 {"naqsh":"/v{/:id}","params":{"id":"7"}}
GET /tolov/5(eski)  → 200 {"naqsh":"/tolov/:id\\(eski\\)","params":{"id":"5"}}
GET /hisobot/2026-10 → 200 {"naqsh":"/hisobot/:yil-:oy","params":{"yil":"2026","oy":"10"}}

Har qatordan bitta qoida:

  1. *nom — wildcard, qiymati massiv. /fayl/a/b.txt da splat — ["a", "b.txt"], satr emas. Express 4 da req.params[0] — "a/b.txt" satri edi. To'liq yo'l kerak bo'lsa: req.params.splat.join("/").
  2. /*splat bo'sh yo'lga mos kelmaydi. /fayl — 404. Ixtiyoriy qilish uchun qavs: /rasm{/*yol}.
  3. { … } — ixtiyoriy qism. /v{/:id} — ham /v, ham /v/7. Ixtiyoriy parametr bo'lmasa, params da kalit umuman yo'q (undefined ham emas).
  4. Maxsus belgilar qochiriladi. ( ) [ ] ? + ! — naqshda maxsus. Ularni oddiy belgi sifatida yozish uchun \\( (JS satrida ikki teskari chiziq).
  5. - va . — ajratuvchi. /:yil-:oy ikki parametr beradi, /:nomi.:ext ham shunday.

Regex bilan cheklash endi yo'q. Biz sinadik: /a/:id(\d+) → Unexpected ( at index 6. Raqam tekshiruvini ishlovchida qiling. vazifalar-api shunday qiladi:

ts
function idniOl(xom: string): number {
  if (!/^[1-9]\d{0,9}$/.test(xom)) {
    throw new HttpXato(400, "id — musbat butun son");
  }
  return Number(xom);
}

Bu yaxshiroq ham: regex marshrutda bo'lsa, mos kelmagan so'rov jim 404 olardi. Ishlovchida esa aniq 400 va tushunarli xabar beriladi (GET /vazifalar/abc → 400 {"xato":"id — musbat butun son"}).

flowchart LR
  A["/fayl/*"] --> A2["/fayl/*splat"]
  B["/v/:id?"] --> B2["/v{/:id}"]
  C["/:id(\\d+)"] --> C2["/:id + tekshiruv ishlovchida"]
  D["/ab(cd)?"] --> D2["ikki marshrut"]

Diagrammada chapda Express 4 naqshi, o'ngda Express 5 dagi o'rnini bosuvchisi. Uchinchi qatorga alohida e'tibor bering: regex naqshdan chiqib, ishlovchi ichiga ko'chdi.

Tekshirib ko'ring: app.get("/hujjat/*yol", …) ga GET /hujjat/2026/hisobot.pdf keldi. req.params.yol nima va /hujjat so'roviga nima bo'ladi?

Javob

req.params.yol — massiv ["2026", "hisobot.pdf"] (Express 4 dagidek "2026/hisobot.pdf" satr emas). GET /hujjat esa 404 oladi: *yol kamida bitta segment talab qiladi. Ikkalasiga ham mos kelishi uchun — /hujjat{/*yol}.

4. Boshqa buzilishlar: ro'yxat

Biz ularning har birini express 5.3.0 da ishga tushirdik:

Express 4 kodi Express 5 da Nima qilish
res.status(1000) RangeError: Invalid status code: 1000 100–999 butun son
res.status("201") TypeError: … must be an integer res.status(201)
res.send(404) status 200, tana 404 res.sendStatus(404)
res.json(obj, 201) 200, ikkinchi argument jim e'tiborsiz res.status(201).json(obj)
res.redirect("back") Location: back req.get("Referrer") ?? "/"
req.param("id") req.param — undefined req.params, req.query, req.body
app.del(...) undefined (kanon) app.delete(...)

Uch xavfli guruh bor:

  • Yiqiladigan (status(1000), status("201"), app.del) — xato darhol ko'rinadi, ular yaxshi.
  • Jim o'zgaradigan (res.send(404), res.json(obj, 201), redirect("back")) — xato yo'q, lekin javob boshqacha. Bularni testlar ushlaydi, ko'z bilan qarash emas.
  • Sukut o'zgargan. express.json() ulangan, lekin tana o'qilmagan bo'lsa (masalan, Content-Type boshqa), Express 4 req.body ga bo'sh obyekt {} berardi. Express 5 esa undefined qoldiradi (rasmiy ko'chish qo'llanmasi; 5 tomonini req obyekti darsida ko'rdik). express.json() umuman ulanmagan bo'lsa — ikkala versiyada ham undefined (kanon). Formada express.urlencoded ning extended sozlamasi endi false (Mashhur middleware'lar). So'rov parametrlari — req.query — faqat getter, unga qiymat berib bo'lmaydi; query parser sukut bo'yicha "simple" (req obyekti darsi). Endi req.host portni ham beradi: biz 127.0.0.1:54715 oldik, req.hostname esa 127.0.0.1.

Express jamoasining rasmiy ko'chish qo'llanmasi bor (Manbalar bo'limida). Unda @expressjs/codemod vositasi ham tilga olingan — eski chaqiruvlarni avtomatik yangilaydi. npm'da u 0.0.5 versiyada (2026-10-24). Biz uni sinamadik.

Maslahat: Ko'chishdan oldin testlar yozing. Kanon vazifalar-api holat 13 da Express 5 ga o'tganda jim o'zgarishlarni aynan testlar topgan: req.body undefined, 405 yo'qligi va 416 → 500.

5. Ko'chish tartibi

  1. Node versiyasini tekshiring: Express 5 Node 18+ talab qiladi (vazifalar-api — Node 24).
  2. npm i express@5 va @types/express@5.
  3. Ilovani ishga tushiring. PathError bergan har naqshni yangi sintaksisga o'tkazing.
  4. grep bilan izlang: app.del, req.param(, redirect("back", res.send( ichidagi son, res.json( ikki argument bilan.
  5. try/catch yamoqlari va express-async-errors ni olib tashlang.
  6. Testlarni ishga tushiring — jim o'zgarishlar shu yerda chiqadi.

6. API qadami: async ishlovchilar (holat 17, 2-qism)

vazifalar-api boshidan Express 5 da yozilgan (holat 13), shuning uchun bu darsda kod o'zgarmaydi. Lekin loyiha Express 5 ning ikki imkoniyatiga to'liq tayanadi. Ularni ko'rib chiqing — hali commit qilmang, commit Express + TypeScript darsida.

Birinchisi — src/vazifalar/marshrut.ts da birorta try/catch yo'q:

ts
r.route("/:id")
  .get(async (req, res) => {
    res.json(await xizmat.ol(idniOl(req.params.id)));
  })
  .delete(async (req, res) => {
    await xizmat.ochir(idniOl(req.params.id));
    res.sendStatus(204);
  })

xizmat.ol vazifa topilmasa HttpXato(404) tashlaydi. idniOl noto'g'ri ID'da sinxron HttpXato(400) tashlaydi. Ikkalasi ham xato ishlovchiga yetadi. Biz holat 17 ni ishga tushirib tekshirdik:

text
GET /vazifalar/999 → 404 {"xato":"Vazifa 999 topilmadi"}
GET /vazifalar/abc → 400 {"xato":"id — musbat butun son"}
DELETE /vazifalar/7 → 404 {"xato":"Vazifa 7 topilmadi"}
GET /yoq → 404 {"xato":"GET /yoq topilmadi"}

Ikkinchisi — 404 middleware'i ham shunchaki throw qiladi (src/ilova.ts):

ts
app.use((req) => {
  throw new HttpXato(404, `${req.method} ${req.path} topilmadi`);
});

Loyihada eski naqsh yo'q: faqat / va /:id. express-async-errors o'rnatilmagan — kanon uni ataylab qo'ymagan.

7. Ko'p uchraydigan xatolar

Belgi Sabab Davosi
PathError: Missing parameter name * yoki : dan keyin nom yo'q /*splat
PathError: Unexpected ? :id? — eski ixtiyoriy {/:id}
PathError: Unexpected ( Naqshda regex yoki guruh Ishlovchida tekshiruv; \\(
req.params.splat.split is not a function Wildcard endi massiv .join("/")
So'rov osilib qoldi (Express 4) async xato ushlanmagan Express 5 yoki try/catch
Jarayon yiqildi setTimeout/callback ichida throw Promise API + await
201 o'rniga 200 res.json(obj, 201) res.status(201).json(obj)

8. Mashqlar

Yechimlar kurs/mashqlar/25/15-express5/ da.

1-mashq (oson): yangi naqsh

Express 4 naqshlarini Express 5 ga o'tkazing:

  • /fayllar/* → /fayllar/ (ixtiyoriy nom, masalan *yol)
  • /kurs/:slug? → /kurs
  • /foydalanuvchi/:id(\d+) → /foydalanuvchi/ + tekshiruv ishlovchida
  • app.del("/x", h) → app.("/x", h)
Yechim
  • /fayllar/*yol — qiymat massiv; /fayllar ning o'zi kerak bo'lsa — /fayllar{/*yol}.
  • /kurs{/:slug} — qavs ichidagi qism ixtiyoriy.
  • /foydalanuvchi/:id — regex naqshdan chiqadi, idniOl kabi funksiya 400 beradi.
  • delete — app.del Express 5 da olib tashlangan.

2-mashq (o'rta): try/catch siz ishlovchi

Quyidagi Express 4 uslubidagi ishlovchini Express 5 uchun qayta yozing: try/catch va next(err) kerak emas, setTimeout callback'i Promise'ga aylansin. Xato baribir xato middleware'iga yetsin.

js
app.get("/kurs", (req, res, next) => {
  setTimeout(() => {
    try {
      if (!req.query.til) throw new Error("til kerak");
      res.json({ kurs: "USD", til: req.query.til });
    } catch (err) {
      next(err);
    }
  }, 50);
});

Toza JS bilan tekshiring: «Express 5 ichida nima bo'ladi» bo'limidagi chaqir modelini oling, ishlovchiga soxta req/res bering. Ikki holat: til bor va yo'q. Yordam: kutish uchun new Promise((ok) => setTimeout(ok, 50)) — Promise darsi.

Yechim
js
const kut = (ms) => new Promise((ok) => setTimeout(ok, ms));

// Express 5 uslubi: async, try/catch yo'q
const handler = async (req, res) => {
  await kut(50);
  if (!req.query.til) throw new Error("til kerak");
  res.json({ kurs: "USD", til: req.query.til });
};

function chaqir(h, req, res, next) {
  try {
    const natija = h(req, res, next);
    if (natija && typeof natija.then === "function") {
      natija.then(undefined, (err) => next(err));
    }
  } catch (err) {
    next(err);
  }
}

const res = { json: (x) => console.log("json:", JSON.stringify(x)) };
const next = (err) => console.log("xato mw:", err.message);
chaqir(handler, { query: { til: "uz" } }, res, next);
chaqir(handler, { query: {} }, res, next);

Konsolda:

text
json: {"kurs":"USD","til":"uz"}
xato mw: til kerak

await kut(50) dan keyingi throw — async funksiya ichida, demak rad etilgan Promise. Model (va haqiqiy Express 5) uni next(err) ga uzatadi.

3-mashq (qiyin): ko'chish auditi

auditQil(manba) funksiyasini yozing: Express 4 kodi satrini oladi va Express 5 da muammo beradigan joylarni topadi. Kamida beshta qoida: app.del(, req.param(, redirect("back" (yoki 'back'), naqshdagi :nom?, naqshdagi yolg'iz * (nomsiz). Har topilma uchun qator raqami va maslahat qaytsin. Yordam: split("\n"), RegExp.test — RegExp darsi. Toza JS — «Ishga tushir» bilan ishlaydi.

Yechim
js
const QOIDALAR = [
  [/\bapp\.del\(/, "app.del → app.delete"],
  [/\breq\.param\(/, "req.param → req.params / query / body"],
  [/redirect\(\s*["']back["']/, "redirect('back') → Referrer"],
  [/["'`][^"'`]*:\w+\?/, ":id? → {/:id}"],
  [/["'`][^"'`]*\/\*(?!\w)/, "/* → /*nom (massiv)"],
];

function auditQil(manba) {
  const topildi = [];
  manba.split("\n").forEach((qator, i) => {
    for (const [naqsh, maslahat] of QOIDALAR) {
      if (naqsh.test(qator)) topildi.push(`${i + 1}: ${maslahat}`);
    }
  });
  return topildi;
}

const eski = [
  'app.get("/fayl/*", yubor);',
  'app.get("/kurs/:slug?", kurs);',
  'app.del("/kurs/:id", ochir);',
  'app.post("/kirish", (req, res) => {',
  '  if (!req.param("login")) return res.redirect("back");',
  "});",
].join("\n");
console.log(auditQil(eski).join("\n"));

Konsolda:

text
1: /* → /*nom (massiv)
2: :id? → {/:id}
3: app.del → app.delete
5: req.param → req.params / query / body
5: redirect('back') → Referrer

Bu — oddiy matn qidiruvi. Haqiqiy loyihada eng ishonchli auditor — ilovani Express 5 da ishga tushirish (PathError darhol chiqadi) va testlar.

4-mashq: API qadami

vazifalar-api da grep -rn "try {" src/vazifalar/ bajaring — natija bo'sh bo'lishi kerak. test/api.test.ts dagi "xatolar" testiga ikki tekshiruv qo'shing: GET /vazifalar/999 → 404 va GET /vazifalar/abc → 400. npm test — yashil. Commit qilmang.

Yechim
ts
const yoq = await fetch(`${asos}/vazifalar/999`);
assert.equal(yoq.status, 404);
assert.deepEqual(await yoq.json(), { xato: "Vazifa 999 topilmadi" });
assert.equal((await fetch(`${asos}/vazifalar/abc`)).status, 400);

Kanon api.test.ts dagi "xatolar: 400 JSON, 415, 422, 405 + Allow, 404" testi 404 ni allaqachon tekshiradi — siz uni shunday kengaytirasiz. Bu test async ishlovchidagi throw Express 5 da ushlanishiga tayanadi: Express 4 da u 2 soniyadan keyin timeout bilan yiqilardi.

9. Real ishda

  • Ko'chish loyihalari. Ko'p kompaniyalar hozir Express 4 dan 5 ga o'tmoqda. "Express 5 da nima o'zgardi?" — intervyu savoli bo'lib qoldi.
  • Kod sharhi (code review). Ishlovchi ichidagi setTimeout(() => { throw … }) yoki qaytarilmagan Promise — butun serverni yiqitadigan xato. Sharhda shuni qidiring.
  • Eski maqolalar. Internetdagi kodni ko'chirishdan oldin qaysi Express versiyasi uchun yozilganini tekshiring.

Xulosa

  • Express 5 async ishlovchidagi throw va rad etilgan Promise'ni o'zi next(err) ga uzatadi; Express 4 da so'rov osilib qolardi.
  • Callback ichidagi throw (masalan setTimeout) hech kim ushlamaydi — jarayon yiqiladi; Promise API va await ishlating.
  • path-to-regexp 8: /*splat (massiv), {/:id} (ixtiyoriy), naqshda regex yo'q, maxsus belgilar \\( bilan.
  • Eski naqsh — ishga tushishda PathError; jim o'zgarishlar (res.send(404), redirect("back")) — testlar bilan topiladi.
  • express-async-errors va har ishlovchidagi try/catch — endi ortiqcha.

Keyingi dars: Template engine'lar va server-side HTML — EJS, Pug va Handlebars bilan serverda HTML yasash va XSS'dan himoya.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Express 5: async xatolar, yangi route sintaksisi va 4 dan ko'chish — IlmHamroh