IlmHamroh
JavaScript Full-stack/24-qism. Node.js45/55-dars14 daqiqa
Mundarija (30)

Node.js'ni debug qilish: --inspect, node inspect va VS Code

Qisqacha: Node'da ichki debugger bor: node --inspect app.js jarayonni 127.0.0.1:9229 portida ochadi, unga VS Code yoki Chrome DevTools (chrome://inspect) ulanadi. --inspect-brk birinchi qatorda to'xtaydi, --inspect-wait debugger ulanishini kutadi. Terminalning o'zida — node inspect app.js: sb(7) breakpoint qo'yadi, cont davom ettiradi, exec x qiymatni ko'rsatadi. Shartli breakpoint (k.kod === "IDR") va logpoint console.log ni kodga yozmasdan almashtiradi. Biz node inspect ni haqiqatan ishga tushirdik; VS Code va DevTools ulanishini sinamadik — u qismlar hujjat bo'yicha.

Bu darsda

  • --inspect, --inspect-brk, --inspect-wait farqini va 9229-port nimaligini bilasiz.
  • node inspect bilan terminalda breakpoint qo'yib, o'zgaruvchilarni ko'rib, qadamma-qadam yurasiz.
  • Shartli breakpoint va logpoint bilan faqat kerakli joyda to'xtaysiz.
  • VS Code'da launch.json va JavaScript Debug Terminal'ni sozlaysiz.
  • Inspector portini internetga ochish nega xavfli ekanini tushuntira olasiz.

Oldin bilishingiz kerak: DevTools bilan debug qilish, Debugging metodologiyasi, TDZ, Permission model.

1. Nega bu kerak?

valyuta kurs IDR ishlaydi, lekin IDR uchun konvertatsiya 100 baravar katta chiqyapti. Odatiy yo'l: kodga console.log(k), console.log(birlik) qo'shib, qayta ishga tushirish. Keyin yana bitta log. Keyin ularni o'chirishni unutib, commit'ga tushib qolishi.

Brauzerda buning yaxshiroq yo'lini ko'rgansiz: DevTools'da breakpoint qo'yasiz, kod to'xtaydi, hamma o'zgaruvchi ko'z oldingizda. Node'da ham aynan shu bor — faqat brauzer oynasi yo'q, shuning uchun debugger tashqaridan ulanadi.

O'xshatish: avtomobil servisi. console.log — haydovchidan "qanday tovush chiqyapti?" deb so'rash. Debugger — mashinani ko'targichga chiqarib, motor ishlab turganda ichiga qarash.

2. Inspector: Node'ning "eshigi"

2.1 --inspect nima qiladi

node --inspect app.js Node ichidagi inspector ni yoqadi. Bu — V8 debugger'iga tashqaridan WebSocket orqali ulanish nuqtasi. Sukut bo'yicha manzil 127.0.0.1:9229. Chrome DevTools, VS Code va node inspect — hammasi bir xil protokol (Chrome DevTools Protocol) bilan shu eshikka ulanadi.

flowchart LR
  A["node --inspect app.js"] --> I["inspector<br/>127.0.0.1:9229"]
  V["VS Code"] -->|WebSocket| I
  C["chrome://inspect"] -->|WebSocket| I
  T["node inspect<br/>(terminal)"] -->|WebSocket| I
  I --> V8["V8: breakpoint,<br/>stek, o'zgaruvchilar"]

Chapdagi uch mijozdan istalgani bitta portga ulanadi. Qaysi birini tanlash — qulaylik masalasi, imkoniyatlar bir xil manbadan.

2.2 Uch bayroq

Bayroq Nima qiladi Qachon
--inspect Eshikni ochadi, kod darhol ishlaydi Server: keyinroq ulanasiz
--inspect-brk Birinchi qatorda to'xtaydi Qisqa skript: boshidan kuzatish
--inspect-wait Debugger ulanguncha kutadi, keyin ishlaydi Ulanib, breakpoint qo'yib, keyin boshlash

=port bilan boshqa port: --inspect=9230; =0 — tasodifiy bo'sh port. valyuta bir zumda tugaydigan CLI — --inspect bilan debugger ulanib ulgurmaydi. Unga --inspect-brk yoki --inspect-wait kerak.

2.3 Eshik ortida nima bor

Biz node --inspect-brk=127.0.0.1:0 hisob.mjs ni ishga tushirdik. stderr'ga:

text
Debugger listening on ws://127.0.0.1:63202/fe901b78-7687-4643-b09c-765ba12e5695
For help, see: https://nodejs.org/learn/getting-started/debugging

63202 — tasodifiy port (sizda boshqa), oxiridagi UUID — sessiya identifikatori. Inspector HTTP orqali o'zi haqida ham aytadi — fetch bilan http://127.0.0.1:63202/json/list ni so'radik (qisqartirilgan):

text
"title": "hisob.mjs",
"type": "node",
"devtoolsFrontendUrl": "devtools://devtools/bundled/js_app.html?…&ws=127.0.0.1:63202/fe901b78-…",
"webSocketDebuggerUrl": "ws://127.0.0.1:63202/fe901b78-7687-4643-b09c-765ba12e5695"

chrome://inspect sahifasi aynan shu ro'yxatni o'qib, "Remote Target" ostida hisob.mjs ni ko'rsatadi. /json/version esa { Browser: 'node.js/v24.21.0', 'Protocol-Version': '1.1' } qaytardi.

2.4 Port band bo'lsa

Bir jarayon --inspect-brk bilan 9229 ni egallab turganda ikkinchisini --inspect bilan ishga tushirdik:

text
Starting inspector on 127.0.0.1:9229 failed: address already in use
ikkinchi ishladi

Diqqat: dastur to'xtamadi — debuggersiz ishlab ketdi. Siz breakpoint kutasiz, lekin u hech qachon to'xtamaydi. Birinchi qatorni o'qing yoki boshqa port bering (--inspect=9230).

Tekshirib ko'ring: node --inspect src/bin.ts kurs USD ni ishga tushirib, darhol VS Code'dan ulanmoqchi bo'ldingiz — "hech narsa topilmadi". Nega?

Javob

--inspect kodni darhol ishga tushiradi. valyuta kurs USD ~100 ms da tugaydi — debugger ulanishga ulgurmaydi, jarayon allaqachon yo'q. Qisqa dasturlar uchun --inspect-brk (birinchi qatorda kutadi) yoki --inspect-wait (ulanguncha boshlamaydi).

3. node inspect: terminaldagi debugger

3.1 Xatoli dastur

Debugger'ni haqiqiy xatoda sinaymiz. hisob.mjs har valyutaning bitta birlik kursini chiqarishi kerak (IDR kursi 10 birlik uchun beriladi — process darsidagi valyuta chiqishini eslang):

js
const kurslar = [
  { kod: "USD", nominal: 1, kurs: 11903.15 },
  { kod: "IDR", nominal: 10, kurs: 6.59 },
  { kod: "EUR", nominal: 1, kurs: 13329.15 },
];
for (const k of kurslar) {
  const birlik = k.kurs * k.nominal; // xato: bo'lish kerak edi
  console.log(k.kod, birlik.toFixed(4));
}

Konsolda:

text
USD 11903.1500
IDR 65.9000
EUR 13329.1500

IDR 0.659 bo'lishi kerak edi. Xato ko'rinib turibdi, lekin uni debugger bilan "topamiz" — buyruqlarni o'rganish uchun.

3.2 Sessiya

node inspect hisob.mjs — Node ikki jarayon ochadi: dastur (--inspect-brk bilan) va unga ulangan terminal mijozi. Biz buyruqlarni sinov skriptidan stdin orqali yubordik (haqiqiy terminal — TTY — emas); sizda xuddi shunday, faqat o'zingiz yozasiz. Haqiqiy chiqish, qisqartirilgan:

text
< Debugger listening on ws://127.0.0.1:9229/a427c997-…
connecting to 127.0.0.1:9229 ... ok
< Debugger attached.
debug> Break on start in hisob.mjs:1
> 1 const kurslar = [
debug> sb(7)
debug> cont
debug> break in hisob.mjs:7
  6 for (const k of kurslar) {
> 7   const birlik = k.kurs * k.nominal; // xato: bo'lish kerak edi
debug> exec k.kod
'USD'

Qatorma-qator:

  • Break on start — node inspect doim birinchi qatorda to'xtaydi (--inspect-brk kabi).
  • sb(7) — set breakpoint: 7-qatorga to'xtash nuqtasi.
  • cont — continue: keyingi to'xtash nuqtasigacha davom et. > belgisi — hozir shu qator bajarilish arafasida.
  • exec k.kod — shu paytdagi kontekstda ifodani hisobla: 'USD'.

3.3 Kutilmagan saboq: TDZ

Shu joyda birlik ni so'radik:

text
debug> exec birlik
ReferenceError: Cannot access 'birlik' from debugger

"Debugger'dan birlik ga murojaat qilib bo'lmaydi". Nega? > 7-qatorni ko'rsatyapti — u hali bajarilmagan. const birlik e'lon qilingan, lekin qiymat olmagan: bu TDZ (vaqtinchalik o'lik zona). Debugger ham TDZ qoidasiga bo'ysunadi. Qiymatni ko'rish uchun bir qadam yuring.

3.4 Kuzatish va qadamlar

text
debug> watch('k.kod')
debug> cont
< USD 11903.1500
debug> break in hisob.mjs:7
Watchers:
  0: k.kod = 'IDR'
debug> next
debug> step in hisob.mjs:8
* 7   const birlik = k.kurs * k.nominal; // xato: bo'lish kerak edi
> 8   console.log(k.kod, birlik.toFixed(4));
debug> cont
< IDR 65.9000
  • watch('k.kod') — har to'xtashda shu ifodani ko'rsat (Watchers: bo'limi).
  • < USD 11903.1500 — < bilan boshlangan qator — dasturning o'z chiqishi.
  • next — keyingi qatorga o'tish (funksiya ichiga kirmasdan). * — breakpoint qo'yilgan qator belgisi.

Asosiy buyruqlar:

Buyruq Ma'nosi
cont, c Davom etish
next, n Keyingi qator
step, s Funksiya ichiga kirish
out, o Funksiyadan chiqish
sb(qator) / cb(fayl, qator) Breakpoint qo'yish / olib tashlash
exec ifoda, repl Qiymatni hisoblash / interaktiv rejim
watch('ifoda'), bt Kuzatish / chaqiruvlar steki (backtrace)
.exit Chiqish

3.5 Shartli breakpoint

Uch valyutada bu oson. 74 ta valyutada (CBU ro'yxati) har birida cont bosish — azob. Shartli breakpoint faqat shart rost bo'lganda to'xtaydi:

text
debug> sb('hisob.mjs', 8, 'k.kod === "IDR"')
debug> cont
< USD 11903.1500
debug> break in hisob.mjs:8
> 8   console.log(k.kod, birlik.toFixed(4));
debug> exec [k.kod, birlik]
[ 'IDR', 65.9 ]

USD o'tib ketdi, to'xtash faqat IDR da. birlik 65.9 — 6.59 * 10. Xato topildi: nominalga ko'paytirish emas, bo'lish kerak. valyuta dagi birlikKursi aynan shunday qiladi: kurs / nominal.

3.6 debugger; kalit so'zi

Breakpoint'ni kod ichiga ham yozish mumkin. Debugger ulanmagan bo'lsa, u hech narsa qilmaydi:

js
const kurs = 11903.15;
debugger; // debugger yo'q — e'tiborsiz qoldiriladi
console.log(kurs * 100);

Konsolda:

text
1190315

Kanon sessiyasida (t45) xuddi shunday faylda node inspect cont dan keyin break in dbg.mjs:3 — aynan debugger; qatorida to'xtadi. debugger; ni commit qilmang — ESLint'ning no-debugger qoidasi uni ushlaydi.

4. VS Code: grafik debugger

Diqqat: Bu bo'limni biz sinamadik — sinov muhitimizda VS Code va Chrome oynasini ochib bo'lmadi. Linux va macOS ham sinalmagan (biz faqat Windows 11 da ishladik). Hammasi rasmiy hujjat (VS Code — Node.js debugging, 2026-10-23 da o'qildi) bo'yicha. Biror narsa siz ko'rgandan farq qilsa — hujjat ustun.

4.1 JavaScript Debug Terminal — eng oson yo'l

VS Code'da: Command Palette → Debug: Create JavaScript Debug Terminal (yoki terminal turlari ro'yxatidan). Shu terminalda ishga tushirilgan har node jarayonga (va npm run dev, node --test ga ham) VS Code avtomatik ulanadi. Hech qanday bayroq yoki sozlama kerak emas. Breakpoint — qator raqamining chap tomonini bosish (qizil nuqta). Yana bir variant — Auto Attach (smart, always, onlyWithFlag rejimlari): oddiy terminaldan ishga tushirilgan Node jarayonlariga avtomatik ulanadi.

4.2 launch.json

Har safar bir xil buyruqni debug qilsangiz — .vscode/launch.json:

jsonc
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "valyuta kurs IDR",
      "program": "${workspaceFolder}/src/bin.ts",
      "args": ["kurs", "IDR", "--offline"],
      "env": { "VALYUTA_KESH": "${workspaceFolder}/.kesh-debug" },
      "skipFiles": ["<node_internals>/**"]
    }
  ]
}
  • "request": "launch" — VS Code dasturni o'zi ishga tushiradi; "attach" — allaqachon --inspect bilan ishlayotganiga ulanadi ("port": 9229).
  • program — .ts fayl bo'lishi mumkin: Node 24 uni o'zi bajaradi (TS to'g'ridan), qator raqamlari mos (turlar bo'sh joyga aylanadi).
  • skipFiles — step bosganda Node'ning ichki kodiga kirmaslik.
  • env — debug paytida haqiqiy keshingizga tegmaslik uchun alohida papka.

F5 — ishga tushirish. Chap panelda: Variables (o'zgaruvchilar), Watch (kuzatuv), Call Stack (chaqiruvlar steki), Breakpoints.

4.3 Shartli breakpoint, hit count, logpoint

Qizil nuqtaga o'ng tugma (hujjat bo'yicha):

  • Conditional Breakpoint — ifoda: k.kod === "IDR" (yuqoridagi sb(…, 'shart') ning grafik ko'rinishi).
  • Hit Count — necha marta yetganda to'xtash: >10 (10 martadan keyin), %2 (har ikkinchisida).
  • Logpoint — to'xtamaydi, faqat konsolga yozadi: kod={k.kod} birlik={birlik}. Bu — kodni o'zgartirmasdan console.log. Debug tugagach, kodda hech qanday iz qolmaydi.

4.4 Chrome DevTools

Brauzerda chrome://inspect → "Open dedicated DevTools for Node". Sources paneli brauzer darsidagidek. Bu yo'l ham sinalmagan — biz faqat inspector /json/list da DevTools uchun tayyor manzil (devtoolsFrontendUrl) berishini ko'rdik.

5. Xavfsizlik: portni ochmang

--inspect=0.0.0.0:9229 — inspector'ni hamma tarmoq interfeyslariga ochadi. Node hujjati ochiq ogohlantiradi: inspektorni ochiq IP'ga bog'lash xavfli, tashqi xost ulanib, istalgan kodni bajarishi (remote code execution) mumkin. Debugger'ga ulangan odam exec bilan hamma narsani qila oladi — fayl o'qish, jarayon ochish.

Qoidalar:

  • Sukut 127.0.0.1 ni o'zgartirmang.
  • Uzoq serverni debug qilish kerak bo'lsa — SSH tunnel: ssh -L 9229:127.0.0.1:9229 server (port faqat sizning kompyuteringizda ochiladi).
  • Prod jarayonni --inspect bilan qoldirmang.
  • Permission model bilan inspector ham cheklanadi (hujjatdagi ro'yxatda "Inspector protocol" bor); ochish uchun — --allow-inspector.

6. CLI qadami: valyuta va debug (holat 46, 2-qism)

Holat 46 ning bu darsga tegishli qismi — kod emas, ish usuli. Kanon NODE_DEBUG=valyuta ni (util darsida qo'shilgan debuglog) to'liq stack bilan kengaytirdi: cli.ts dagi xato ushlovchi endi debug("%s", xato.stack) ni ham yozadi. Bu — "debugger'siz debug": foydalanuvchi muammoni yuborganda undan NODE_DEBUG=valyuta valyuta … chiqishini so'raysiz. Natijasini keyingi darsda ko'rasiz. Hali commit qilmang — commit keyingi darsda.

O'zingiz uchun ish tartibi:

bash
node --inspect-brk src/bin.ts kurs IDR --offline

Keyin VS Code'da "Attach" yoki JavaScript Debug Terminal'da shunchaki node src/bin.ts kurs IDR --offline. src/kurs.ts dagi birlikKursi ga breakpoint qo'ying va IDR uchun nominal 10 ekanini ko'ring.

Kanon o'lchovi (t45) bu holatdagi yana bir o'zgarishga tegishli: source map yoqilishi --help ni 87.7 dan 92.2 ms ga (+4.5 ms, n=15) oshirdi — bu keyingi darsning mavzusi.

7. Ko'p uchraydigan xatolar

Belgi Sabab Davosi
Debugger ulanmadi, dastur tugab qoldi --inspect + qisqa dastur --inspect-brk yoki --inspect-wait
address already in use, breakpoint ishlamaydi 9229 band — dastur debuggersiz ishladi Eski jarayonni yoping yoki boshqa port
Cannot access 'x' from debugger Qator hali bajarilmagan (TDZ) next, keyin exec
Breakpoint "kulrang", to'xtamaydi Fayl boshqa (dist vs src) yoki source map yo'q To'g'ri faylga qo'ying; .ts — Node 24 da to'g'ridan
step Node ichiga kirib ketdi skipFiles yo'q "<node_internals>/**"
debugger; prod'ga tushdi Unutilgan ESLint no-debugger
Serverda --inspect=0.0.0.0 Port tashqariga ochiq Faqat 127.0.0.1 + SSH tunnel

8. Mashqlar

Yechimlar kurs/mashqlar/24/45-debug/ da.

1-mashq (oson): qaysi buyruq?

  • Birinchi qatorda to'xtab, debugger kutadigan bayroq — --inspect-
  • node inspect da 12-qatorga breakpoint —
  • Keyingi breakpoint'gacha davom etish —
  • Inspector sukut porti —
  • To'xtamasdan konsolga yozadigan breakpoint turi —
Yechim
  • brk — "break".
  • sb(12) — set breakpoint.
  • cont — yoki qisqa c.
  • 9229 — 127.0.0.1:9229.
  • logpoint — VS Code'da qizil nuqtaga o'ng tugma → Add Logpoint.

2-mashq (o'rta): logpoint'ni kodda modellash

VS Code logpoint'i kod={k.kod} birlik={birlik} kabi shablonni olib, {…} ichidagi ifodani hisoblaydi. Shunga o'xshash formatLogpoint(template, scope) funksiyasini yozing: {nom} va {obj.maydon} ni scope dan oladi (nuqtali yo'l), topilmasa — <yo'q>. eval ishlatmang — u satrdagi istalgan kodni bajaradi va xavfli.

Yechim
js
function formatLogpoint(template, scope) {
  return template.replace(/\{([\w.]+)\}/g, (_, path) => {
    let value = scope;
    for (const key of path.split(".")) {
      value = value?.[key];
    }
    return value === undefined ? "<yo'q>" : String(value);
  });
}

const k = { kod: "IDR", nominal: 10, kurs: 6.59 };
const scope = { k, birlik: 65.9 };
console.log(formatLogpoint("kod={k.kod} birlik={birlik}", scope));
const template = "nominal={k.nominal} sana={k.sana}";
console.log(formatLogpoint(template, scope));

Konsolda:

text
kod=IDR birlik=65.9
nominal=10 sana=<yo'q>

Haqiqiy logpoint {} ichida istalgan JS ifodani bajaradi (debugger kontekstida). Bizning model faqat nuqtali yo'lni qo'llaydi — eval siz xavfsiz versiya.

3-mashq (qiyin): debugger bilan xato topish

Quyidagi funksiya 2026-10-19 dan 2026-10-23 gacha ish kunlari sonini qaytarishi kerak (5 kun, shanba-yakshanba yo'q — 2026-10-19 dushanba). U 4 qaytaradi. Avval node inspect bilan xatoni toping (sb, watch('kun'), cont), keyin tuzating. Javobda — qaysi buyruq xatoni ko'rsatdi.

js
function workdays(from, to) {
  let count = 0;
  const day = new Date(from);
  while (day < new Date(to)) {
    const w = day.getUTCDay();
    if (w !== 0 && w !== 6) count++;
    day.setUTCDate(day.getUTCDate() + 1);
  }
  return count;
}
console.log(workdays("2026-10-19", "2026-10-23")); // 4 — xato
Yechim

Biz shu sessiyani o'tkazdik: sb(5), watch('day.toISOString()'), keyin cont bir necha marta. Kuzatuv (qisqartirilgan):

text
break in wd.mjs:5
  0: day.toISOString() = '2026-10-19T00:00:00.000Z'
break in wd.mjs:5
  0: day.toISOString() = '2026-10-20T00:00:00.000Z'
break in wd.mjs:5
  0: day.toISOString() = '2026-10-21T00:00:00.000Z'
break in wd.mjs:5
  0: day.toISOString() = '2026-10-22T00:00:00.000Z'
< 4

…23 hech qachon kelmadi. Sikl sharti day < to oxirgi kunni chiqarib tashlaydi. Tuzatish — <=:

js
function workdays(from, to) {
  let count = 0;
  const day = new Date(from);
  const end = new Date(to);
  while (day <= end) {
    const w = day.getUTCDay();
    if (w !== 0 && w !== 6) count++;
    day.setUTCDate(day.getUTCDate() + 1);
  }
  return count;
}
console.log(workdays("2026-10-19", "2026-10-23"));
console.log(workdays("2026-10-17", "2026-10-18"));

Konsolda:

text
5
0

Ikkinchi tekshiruv — dam olish kunlari (17–18 oktyabr, shanba-yakshanba): 0. "Chegaradagi" xato (off-by-one) — debugger'da watch bilan eng tez ko'rinadi: oxirgi qiymat qaysi ekanini bevosita ko'rasiz.

4-mashq: CLI qadami

valyuta da src/kurs.ts dagi birlikKursi ichida / ni vaqtincha * ga almashtiring. node inspect src/bin.ts kurs IDR --offline bilan (yoki VS Code'da) shu qatorga shartli breakpoint qo'yib (k.kod === "IDR"), exec bilan qiymatlarni ko'ring. npm test qaysi test yiqilishini ham tekshiring. Qaytaring. Commit qilmang.

Yechim

sb('src/kurs.ts', <qator>, 'k.kod === "IDR"'). Qator — birlikKursi ichidagi return (kanonda funksiya parametri k). exec [k.nominal, k.kurs * k.nominal] — [ 10, 65.9 ]. npm test da test/kurs.test.ts dagi "nominal hisobga olinadi (IDR — 10 birlik uchun)" testi yiqiladi. Test xato borligini avtomatik aytadi, debugger esa qayerda va nega ekanini ko'rsatadi.

9. Real ishda

  • Backend jamoalarda VS Code debugger kundalik vosita: serverni --inspect bilan ishga tushirib, kelgan so'rovda to'xtash (25-qism serverlari).
  • Testni debug qilish — JavaScript Debug Terminal'da node --test yoki Vitest: yiqilgan test ichida to'xtash.
  • Docker ichidagi Node — --inspect=0.0.0.0:9229 faqat konteyner ichida va port tashqariga faqat 127.0.0.1 ga ochiladi (Docker asoslari — 26-qism, deploy — keyingi qismlar).
  • Intervyu savollari: "console.log dan boshqa qanday debug qilasiz?", "--inspect va --inspect-brk farqi?", "Prod serverni qanday xavfsiz debug qilasiz?".

Xulosa

  • --inspect — 127.0.0.1:9229 da eshik; --inspect-brk — birinchi qatorda kutadi; --inspect-wait — ulanguncha boshlamaydi.
  • node inspect: sb, cont, next, step, exec, watch, bt — terminaldagi to'liq debugger (biz sinadik).
  • Bajarilmagan qatordagi const — Cannot access … from debugger (TDZ).
  • Shartli breakpoint, hit count, logpoint — console.log ni kodga yozmasdan almashtiradi.
  • VS Code: JavaScript Debug Terminal yoki launch.json (sinalmagan, hujjat bo'yicha).
  • Inspector portini tashqariga ochmang — bu masofadan kod bajarish eshigi.

Keyingi dars: Stack trace, source map va error.cause — xato xabarini to'g'ri o'qish, nega valyuta da source map birinchi urinishda ishlamagani va xato sabablari zanjiri.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Node.js'ni debug qilish: --inspect, node inspect va VS Code — IlmHamroh