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:
writeFileSyncbilannotes.txtyarating va ichiga uch qator matn yozing;- Faylni
readFileSyncbilan o’qing — avval"utf8"bilan, keyin usiz, natijalarni solishtiring; appendFileSyncni ikki marta chaqirib,log.txtga yozuv qo’shing va faylni ochib qatorlar to’planganini ko’ring;- Mavjud bo’lmagan faylni o’qib
ENOENTxatosini chiqaring, so’ngexistsSyncbilan tekshiruv qo’shib xatoni oldini oling; - Uchta talaba obyektini
students.jsongaJSON.stringifybilan yozing va qayta o’qib ismlarni chiqaring; fs.promisesbilan o’qish yozing vaconsole.logniawaitdan 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 installtalab qilmaydi.- Matn o’qiyotganda
"utf8"yozilmasa natija Buffer bo’lib chiqadi. writeFileSynceskisini o’chiradi,appendFileSyncoxiriga qo’shadi.Syncmetodlari kutish paytida butun dasturni to’xtatadi — server kodida ishlatilmaydi.fs.promisesvaasync/awaitbloklamaydigan yo’l, xatotry/catchbilan ushlanadi.ENOENTfayl topilmaganini bildiradi: nom yoki papkani tekshiring.- Foydalanuvchi bergan fayl nomi tekshirilmasdan
fsga berilmaydi.
Keyingi darsda path moduli — fayl yo’lini xatosiz yig’ish va papka ichini o’qish.