Node.js fs moduli: fayl bilan ishlash

Node.js nima darsidagi jadvalda brauzer qila olmaydigan bitta qator bor edi: diskdan fayl o’qish. Endi shu ishni qilasiz. Sozlamalarni faylda saqlash, jurnal yozish, ma’lumot o’qish — hammasi fs moduli orqali.

fs modulini olib kirish

fs — Node.js ichidagi o’rnatilgan modul. npm install shart emas.

const fs = require("fs");

Faylga yozish

node-start papkasida write-demo.js yarating:

const fs = require("fs");

const text = "Birinchi qator\nIkkinchi qator";

fs.writeFileSync("notes.txt", text, "utf8");

console.log("Fayl yozildi");
node write-demo.js
Fayl yozildi

Papkada notes.txt paydo bo’ldi. Uni muharrirda oching — ikki qator matn turadi.

Faylni o’qish

const fs = require("fs");

const content = fs.readFileSync("notes.txt", "utf8");

console.log(content);
console.log("Belgilar soni:", content.length);
Birinchi qator
Ikkinchi qator
Belgilar soni: 29

Uchinchi argumentga e’tibor bering — "utf8". Uni yozmasangiz natija boshqacha chiqadi:

const fs = require("fs");

const raw = fs.readFileSync("notes.txt");

console.log(raw);
<Buffer 42 69 72 69 6e 63 68 69 20 71 61 74 6f 72 0a 49 6b 6b 69 6e 63 68 ...>

Matn bilan ishlayotgan bo’lsangiz, "utf8" ni har doim yozing.

Oxiriga qo’shish: appendFile

Jurnal (log) yozishda har safar ustiga yozish noto’g’ri — yozuvlar to’planib borishi kerak:

const fs = require("fs");

fs.appendFileSync("log.txt", "Dastur ishga tushdi\n", "utf8");
fs.appendFileSync("log.txt", "Foydalanuvchi kirdi\n", "utf8");

console.log(fs.readFileSync("log.txt", "utf8"));
Dastur ishga tushdi
Foydalanuvchi kirdi

Faylni ikkinchi marta ishga tushirsangiz, qatorlar to’rtta bo’ladi — appendFileSync mavjud mazmunni saqlaydi. Fayl bo’lmasa, o’zi yaratadi.

Fayl bormi: existsSync

Yo’q faylni o’qishga urinish xato beradi. Oldindan tekshirish mumkin:

const fs = require("fs");

if (fs.existsSync("notes.txt")) {
  const content = fs.readFileSync("notes.txt", "utf8");
  console.log("Mazmun:", content);
} else {
  console.log("Fayl topilmadi");
}
Mazmun: Birinchi qator
Ikkinchi qator

Sinxron nima degani

Yuqoridagi hamma metod nomi Sync bilan tugadi.

Buni ko’rish mumkin:

const fs = require("fs");

console.log("1. O'qish boshlandi");

const content = fs.readFileSync("notes.txt", "utf8");

console.log("2. O'qildi, uzunligi:", content.length);
console.log("3. Tugadi");
1. O'qish boshlandi
2. O'qildi, uzunligi: 29
3. Tugadi

Tartib aniq: 1, 2, 3. Kichik skript uchun bu qulay.

Nega sinxron serverni bloklaydi

Muammo server yozganda chiqadi. Node.js nima darsidan eslang: Node.js bitta oqimda ishlaydi.

Tasavvur qiling, server 100 ta foydalanuvchiga xizmat qilyapti va har so’rovda readFileSync chaqiriladi. Disk javobini kutgan har bir millisekundda Node.js hech kimga javob bera olmaydi — navbatdagi 99 so’rov kutib turadi.

Yondashuv Kutish paytida
readFileSync Butun dastur to’xtaydi
readFile (asinxron) Boshqa so’rovlar bajariladi

Asinxron yo’l: fs.promises

Zamonaviy usul — fs.promises va async/await:

const fs = require("fs").promises;

async function readNotes() {
  const content = await fs.readFile("notes.txt", "utf8");
  console.log("Mazmun:", content);
}

readNotes();
console.log("Bu qator oldin chiqadi");
Bu qator oldin chiqadi
Mazmun: Birinchi qator
Ikkinchi qator

Tartibga qarang: oxirgi console.log birinchi chiqdi. Node.js fayl o’qish buyrug’ini berib, javobni kutmasdan keyingi qatorga o’tdi.

Aynan shu — bloklamaslik. Kutish paytida dastur boshqa ish qila oladi.

Xatoni ushlash

Asinxron kodda xato try/catch bilan ushlanadi:

const fs = require("fs").promises;

async function readConfig() {
  try {
    const content = await fs.readFile("config.json", "utf8");
    const config = JSON.parse(content);
    console.log("Dastur nomi:", config.appName);
  } catch (error) {
    console.log("O'qib bo'lmadi:", error.code);
  }
}

readConfig();

config.json yo’q bo’lsa:

O'qib bo'lmadi: ENOENT

error.code — xatoning qisqa belgisi. To’liq xabarni error.message beradi. Xatolarni ushlash darsidagi qoidalar shu yerda ham amal qiladi.

JSON faylni o’qish va yozish

Amalda ma’lumot ko’pincha JSON shaklida saqlanadi:

const fs = require("fs").promises;

async function saveUsers() {
  const users = [
    { id: 1, name: "Aziz", city: "Toshkent" },
    { id: 2, name: "Dilnoza", city: "Samarqand" },
  ];

  // Obyektni matnga aylantiramiz, 2 — chiroyli bo'shliq uchun
  await fs.writeFile("users.json", JSON.stringify(users, null, 2), "utf8");
  console.log("Saqlandi");

  const content = await fs.readFile("users.json", "utf8");
  const loaded = JSON.parse(content);
  console.log("O'qildi, soni:", loaded.length);
  console.log("Birinchisi:", loaded[0].name);
}

saveUsers();
Saqlandi
O'qildi, soni: 2
Birinchisi: Aziz

users.json fayli shunday ko’rinadi:

[
  {
    "id": 1,
    "name": "Aziz",
    "city": "Toshkent"
  },
  {
    "id": 2,
    "name": "Dilnoza",
    "city": "Samarqand"
  }
]

Faylga har doim matn yoziladi — shuning uchun JSON.stringify majburiy. O’qishda esa teskarisi: JSON.parse matnni obyektga qaytaradi.

Foydalanuvchi bergan yo’lga ishonmang

Fayl nomini foydalanuvchidan olsangiz, uni tekshirmasdan fs ga bermang.

Katta fayl muammosi

readFile faylni butunlay xotiraga yuklaydi. Fayl 50 KB bo’lsa muammo yo’q. 1 GB bo’lsa — jiddiy muammo: shuncha xotira band bo’ladi.

Bunday hollarda fayl bo’lak-bo’lak o’qiladi. Oqimlar darsi aynan shu haqda — hozircha fs.promises bilan ishlayveramiz, fayllarimiz kichik.

Amaliy mashq

node-start papkasida bajaring:

  1. writeFileSync bilan notes.txt yarating va ichiga uch qator matn yozing;
  2. Faylni readFileSync bilan o’qing — avval "utf8" bilan, keyin usiz, natijalarni solishtiring;
  3. appendFileSync ni ikki marta chaqirib, log.txt ga yozuv qo’shing va faylni ochib qatorlar to’planganini ko’ring;
  4. Mavjud bo’lmagan faylni o’qib ENOENT xatosini chiqaring, so’ng existsSync bilan tekshiruv qo’shib xatoni oldini oling;
  5. Uchta talaba obyektini students.json ga JSON.stringify bilan yozing va qayta o’qib ismlarni chiqaring;
  6. fs.promises bilan o’qish yozing va console.log ni await dan keyin hamda funksiya chaqiruvidan keyin qo’yib, chiqish tartibini kuzating.

6-qadam eng muhimi: asinxron kodda qator tartibi yozilish tartibida emas ekanini o’z ko’zingiz bilan ko’rasiz.

Qisqacha xulosa

  • fs — Node.js ichidagi o’rnatilgan modul, npm install talab qilmaydi.
  • Matn o’qiyotganda "utf8" yozilmasa natija Buffer bo’lib chiqadi.
  • writeFileSync eskisini o’chiradi, appendFileSync oxiriga qo’shadi.
  • Sync metodlari kutish paytida butun dasturni to’xtatadi — server kodida ishlatilmaydi.
  • fs.promises va async/await bloklamaydigan yo’l, xato try/catch bilan ushlanadi.
  • ENOENT fayl topilmaganini bildiradi: nom yoki papkani tekshiring.
  • Foydalanuvchi bergan fayl nomi tekshirilmasdan fs ga berilmaydi.

Keyingi darsda path moduli — fayl yo’lini xatosiz yig’ish va papka ichini o’qish.

Bu dars foydali bo'ldimi?

marta ko'rildi