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.

🕑 13 daqiqa o‘qish 📄 621 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. path moduli
  2. Nega qo'lda birlashtirmaslik kerak
  3. Joriy fayl qayerda
  4. process.argv
  5. parseArgs
  6. Muhit o'zgaruvchilari
  7. Chiqish kodlari
  8. os moduli
  9. Signallar
  10. Xulosa

Fayl yo'llarini qo'lda birlashtirish - xatoning eng keng tarqalgan manbalaridan biri. Node da buning uchun alohida modul bor.

path moduli #

JavaScript
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"));
Natija
hujjatlar/hisobot/yakuniy.pdf
yakuniy.pdf
yakuniy
.pdf
hujjatlar/hisobot
/tmp/fayl.txt
FunksiyaNima qiladi
joinBo'laklarni birlashtiradi
resolveTo'liq yo'lga aylantiradi
basenameFayl nomini oladi
extnameKengaytmani oladi
dirnamePapka qismini oladi

resolve .. va . ni hisobga oladi va natija doim ildizdan boshlanadi.

Nega qo'lda birlashtirmaslik kerak #

JavaScript
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"));
Natija
hujjatlar/hisobot.txt
hujjatlar/hisobot.txt
Ajratgich uzunligi: 1
a/c
a/b
Windows da ajratgich boshqa

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 #

JavaScript
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));
Natija
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).

process.cwd() va import.meta.dirname bir xil emas

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 #

JavaScript
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"));
Natija
Argumentlar: 0
Birinchi element - node: true
Ikkinchi element - skript: true

parseArgs #

Qo'lda tahlil qilish o'rniga Node da tayyor vosita bor:

JavaScript
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);
Natija
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 #

JavaScript
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));
Natija
salom
odatiy qiymat
true
Port soni: 3000 true
process.env qiymatlari doim satr

Bu juda ko'p xatoga sabab bo'ladi:

JavaScript
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:

JavaScript
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 #

JavaScript
console.log("Ish bajarildi");

process.exitCode = 0;

console.log("Chiqish kodi:", process.exitCode);
console.log("PID musbat:", process.pid > 0);
Natija
Ish bajarildi
Chiqish kodi: 0
PID musbat: true

Chiqish kodi buyruq qatoriga natijani bildiradi: 0 - muvaffaqiyat, boshqa har qanday son - xato.

UsulXatti-harakati
process.exitCode = 1Dastur tabiiy tugaydi, kod 1 bo'ladi
process.exit(1)Darhol to'xtaydi
process.exit() ni ehtiyotkorlik bilan

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:

JavaScript
if (xato) {
    console.error("Xato:", xato.message);
    process.exitCode = 1;
    return;
}

Shunda Node navbatdagi ishlarni tugatib, keyin toza chiqadi.

os moduli #

JavaScript
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);
Natija
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 #

JavaScript
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);
Natija
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.

Amaliy topshiriq
  1. join bilan uch bo'lakdan yo'l yasang.
  2. basename, extname, dirname ni sinang.
  3. resolve ga .. berib, natijani ko'ring.
  4. import.meta.dirname va process.cwd() ni solishtiring.
  5. Dasturni boshqa papkadan ishga tushirib, farqni ko'ring.
  6. process.argv.slice(2) ni chiqaring.
  7. parseArgs bilan bayroq va qiymat oling.
  8. Muhit o'zgaruvchisini Number() siz taqqoslab ko'ring.
  9. DEBUG=false qiymati rost ekanini isbotlang.
  10. process.exitCode va process.exit() farqini o'ylang.

Xulosa #

  • Yo'lni hech qachon + bilan yasamang - join ishlating.
  • resolve to'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 uchun parseArgs.
  • process.env qiymatlari doim satr - sonni Number() bilan, mantiqiyni === "true" bilan tekshiring.
  • process.exitCode afzal, process.exit() esa ishni yarim yo'lda uzishi mumkin.
  • os moduli tizim haqida ma'lumot beradi; EOL platformaga bog'liq.
  • SIGINT ni tinglab, muloyim to'xtash qilish mumkin.

Keyingi bo'limda hodisalar siklini o'rganamiz.

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.