6-bo‘lim
Yo'llar, process va muhit
path moduli, Windows va Linux farqi, import.meta.dirname, process.argv va parseArgs, chiqish kodlari hamda os moduli.
Ushbu bo‘lim mundarijasi
Fayl yo'llarini qo'lda birlashtirish - xatoning eng keng tarqalgan manbalaridan biri. Node da buning uchun alohida modul bor.
path moduli #
import { join, resolve, basename, extname, dirname } from "node:path";
const yol = join("hujjatlar", "hisobot", "yakuniy.pdf");
console.log(yol);
console.log(basename(yol));
console.log(basename(yol, ".pdf"));
console.log(extname(yol));
console.log(dirname(yol));
console.log(resolve("/tmp", "ish", "..", "fayl.txt"));
hujjatlar/hisobot/yakuniy.pdf
yakuniy.pdf
yakuniy
.pdf
hujjatlar/hisobot
/tmp/fayl.txt
| Funksiya | Nima qiladi |
|---|---|
join | Bo'laklarni birlashtiradi |
resolve | To'liq yo'lga aylantiradi |
basename | Fayl nomini oladi |
extname | Kengaytmani oladi |
dirname | Papka qismini oladi |
resolve .. va . ni hisobga oladi va natija doim ildizdan
boshlanadi.
Nega qo'lda birlashtirmaslik kerak #
import { join, sep } from "node:path";
const qolda = "hujjatlar" + "/" + "hisobot.txt";
const togri = join("hujjatlar", "hisobot.txt");
console.log(qolda);
console.log(togri);
console.log("Ajratgich uzunligi:", sep.length);
console.log(join("a", "b", "..", "c"));
console.log(join("a/", "/b"));
hujjatlar/hisobot.txt
hujjatlar/hisobot.txt
Ajratgich uzunligi: 1
a/c
a/b
Linux va macOS da yo'l ajratgichi - /, Windows da esa \.
Yuqoridagi misol Linux da ikkala shakl ham bir xil natija berdi.
Windows da esa join hujjatlar\hisobot.txt qaytaradi, qo'lda
yozilgani esa hujjatlar/hisobot.txt bo'lib qolaveradi.
Ko'p holatda Windows ikkalasini ham tushunadi, lekin yo'llarni solishtirganda yoki tashqi dasturga uzatganda farq bilinadi.
Yana ikki foyda: join ortiqcha ajratgichlarni yig'ishtiradi
(oxirgi ikki qatorga qarang) va .. ni hisoblaydi.
Qoida: yo'lni hech qachon + bilan yasamang.
Joriy fayl qayerda #
import { basename, dirname } from "node:path";
console.log(typeof import.meta.dirname);
console.log(typeof import.meta.filename);
console.log(basename(import.meta.filename).endsWith(".mjs"));
console.log(import.meta.dirname === dirname(import.meta.filename));
string
string
true
true
CommonJS da __dirname va __filename bor edi. ESM da ularning
o'rniga import.meta.dirname va import.meta.filename keladi
(Node 20.11 dan).
Bu ikkisi juda ko'p chalkashtiriladi:
import.meta.dirname- fayl qayerda turgani.process.cwd()- dastur qayerdan ishga tushirilgani.
Agar /uy/loyiha dan node src/index.js deb yozsangiz:
cwd - /uy/loyiha, dirname esa /uy/loyiha/src.
Fayl yonidagi resursni o'qiyotgan bo'lsangiz - import.meta.dirname
ishlating. Foydalanuvchi ko'rsatgan yo'l bilan ishlayotgan
bo'lsangiz - cwd.
Buni chalkashtirish "menda ishlayapti, serverda ishlamayapti" muammosining klassik sababi.
process.argv #
const argumentlar = process.argv.slice(2);
console.log("Argumentlar:", argumentlar.length);
console.log("Birinchi element - node:",
process.argv[0].includes("node"));
console.log("Ikkinchi element - skript:",
process.argv[1].endsWith(".mjs"));
Argumentlar: 0
Birinchi element - node: true
Ikkinchi element - skript: true
parseArgs #
Qo'lda tahlil qilish o'rniga Node da tayyor vosita bor:
import { parseArgs } from "node:util";
const { values, positionals } = parseArgs({
args: ["--nom", "Malika", "--batafsil", "fayl.txt"],
options: {
nom: { type: "string" },
batafsil: { type: "boolean", default: false },
soni: { type: "string", default: "10" },
},
allowPositionals: true,
});
console.log(values.nom);
console.log(values.batafsil);
console.log(values.soni);
console.log(positionals);
Malika
true
10
[ 'fayl.txt' ]
parseArgs Node 18.3 dan barqaror. U bayroqlarni, qiymatlarni
va oddiy argumentlarni ajratadi.
Haqiqiy dasturda args bermaysiz - u o'zi process.argv dan
oladi.
Muhit o'zgaruvchilari #
process.env.SINOV_QIYMAT = "salom";
console.log(process.env.SINOV_QIYMAT);
console.log(process.env.YOQ_BUNDAY ?? "odatiy qiymat");
console.log(typeof process.env.PATH === "string");
const port = Number(process.env.PORT ?? 3000);
console.log("Port soni:", port, Number.isInteger(port));
salom
odatiy qiymat
true
Port soni: 3000 true
Bu juda ko'p xatoga sabab bo'ladi:
const port = process.env.PORT; // "8080" - SATR
if (port === 8080) { } // hech qachon rost emas
Muhit o'zgaruvchisi doim satr bo'ladi, hatto raqamga o'xshasa
ham. Uni Number() bilan aylantiring.
Mantiqiy qiymat yanada xavfli:
const nosozlik = process.env.DEBUG; // "false" - SATR
if (nosozlik) { } // ROST! bo'sh bo'lmagan satr
"false" - bo'sh bo'lmagan satr, demak u rost. To'g'ri yo'l:
process.env.DEBUG === "true".
Chiqish kodlari #
console.log("Ish bajarildi");
process.exitCode = 0;
console.log("Chiqish kodi:", process.exitCode);
console.log("PID musbat:", process.pid > 0);
Ish bajarildi
Chiqish kodi: 0
PID musbat: true
Chiqish kodi buyruq qatoriga natijani bildiradi: 0 - muvaffaqiyat,
boshqa har qanday son - xato.
| Usul | Xatti-harakati |
|---|---|
process.exitCode = 1 | Dastur tabiiy tugaydi, kod 1 bo'ladi |
process.exit(1) | Darhol to'xtaydi |
process.exit() dasturni o'sha zahoti to'xtatadi. Tugallanmagan
ishlar - faylga yozish, jurnal chiqarish - yo'qolishi mumkin.
Deyarli har doim process.exitCode ni o'rnatib, funksiyadan
qaytgan ma'qul:
if (xato) {
console.error("Xato:", xato.message);
process.exitCode = 1;
return;
}
Shunda Node navbatdagi ishlarni tugatib, keyin toza chiqadi.
os moduli #
import { platform, cpus, homedir, tmpdir, EOL } from "node:os";
console.log("Platforma ma'lum:",
["linux", "darwin", "win32"].includes(platform()));
console.log("Yadrolar bor:", cpus().length > 0);
console.log("Uy papkasi bor:", homedir().length > 0);
console.log("Vaqtinchalik papka bor:", tmpdir().length > 0);
console.log("Qator oxiri uzunligi:", EOL.length);
Platforma ma'lum: true
Yadrolar bor: true
Uy papkasi bor: true
Vaqtinchalik papka bor: true
Qator oxiri uzunligi: 1
EOL - tizimning qator oxiri belgisi: Linux da \n (1 belgi),
Windows da \r\n (2 belgi).
E'tibor bering: bu yerda hech bir aniq qiymat chop etilmadi - hammasi sizning kompyuteringizga bog'liq.
Signallar #
let tozalandi = false;
function tozala() {
tozalandi = true;
}
process.on("SIGINT", tozala);
console.log("Tinglovchi qo'shildi:",
process.listenerCount("SIGINT") > 0);
console.log("Hali tozalanmadi:", tozalandi);
process.removeListener("SIGINT", tozala);
console.log("Olib tashlandi:", process.listenerCount("SIGINT") === 0);
Tinglovchi qo'shildi: true
Hali tozalanmadi: false
Olib tashlandi: true
SIGINT - foydalanuvchi Ctrl+C bosganda keladigan signal.
Serverlarda bu muhim: signal kelganda ochiq ulanishlarni yopib, keyin chiqish kerak. Buni muloyim to'xtash deb atashadi va 20-bo'limdagi loyihada ishlatamiz.
joinbilan uch bo'lakdan yo'l yasang.basename,extname,dirnameni sinang.resolvega..berib, natijani ko'ring.import.meta.dirnamevaprocess.cwd()ni solishtiring.- Dasturni boshqa papkadan ishga tushirib, farqni ko'ring.
process.argv.slice(2)ni chiqaring.parseArgsbilan bayroq va qiymat oling.- Muhit o'zgaruvchisini
Number()siz taqqoslab ko'ring. DEBUG=falseqiymati rost ekanini isbotlang.process.exitCodevaprocess.exit()farqini o'ylang.
Xulosa #
- Yo'lni hech qachon
+bilan yasamang -joinishlating. resolveto'liq yo'l beradi va..ni hisoblaydi.import.meta.dirname- fayl qayerda;process.cwd()- dastur qayerdan ishga tushirilgan.process.argv.slice(2)- haqiqiy argumentlar; jiddiy tahlil uchunparseArgs.process.envqiymatlari doim satr - sonniNumber()bilan, mantiqiyni=== "true"bilan tekshiring.process.exitCodeafzal,process.exit()esa ishni yarim yo'lda uzishi mumkin.osmoduli tizim haqida ma'lumot beradi;EOLplatformaga bog'liq.SIGINTni tinglab, muloyim to'xtash qilish mumkin.
Keyingi bo'limda hodisalar siklini o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.