Node.js yakuniy loyiha: CLI dastur

Bo’lim davomida qismlarni alohida o’rgandingiz: argument o’qish, fayl yozish, yo’l yig’ish. Endi ularni bitta ishlaydigan vositaga birlashtiramiz. Natija — terminaldan boshqariladigan vazifalar ro’yxati: node todo.js add "Non sotib olish" yozasiz, dastur uni saqlaydi.

Nima quramiz

Uchta buyruq bo’ladi:

Buyruq Vazifasi
node todo.js add "matn" Yangi vazifa qo’shadi
node todo.js list Ro’yxatni chiqaradi
node todo.js done 2 Vazifani bajarilgan deb belgilaydi

Ma’lumot todos.json faylida saqlanadi — dastur yopilgandan keyin ham qoladi.

Qaysi bilim qayerda ishlaydi

Loyiha butun bo’limni jamlaydi:

Qism Qaysi darsdan
Argumentlarni o’qish process va argumentlar
Faylga yozish va o’qish fs moduli
Yo’lni __dirname bilan yig’ish path moduli
Funksiyalarni ajratish modul tizimi
Chiqish kodlari process va argumentlar

1-qadam: ma’lumot bilan ishlash

todo.js faylini yarating. Avval saqlash va o’qish funksiyalari:

const fs = require("fs");
const path = require("path");

// Fayl skript turgan papkada bo'ladi — terminal qayerdan ochilganidan qat'i nazar
const dataPath = path.join(__dirname, "todos.json");

function loadTodos() {
  if (!fs.existsSync(dataPath)) {
    return [];
  }
  const content = fs.readFileSync(dataPath, "utf8");
  return JSON.parse(content);
}

function saveTodos(todos) {
  fs.writeFileSync(dataPath, JSON.stringify(todos, null, 2), "utf8");
}

loadTodos fayl yo’qligini oldindan tekshiradi — birinchi ishga tushirishda ENOENT chiqmasligi uchun bo’sh massiv qaytaradi.

path.join(__dirname, ...) ishlatilgani muhim: dastur qaysi papkadan chaqirilsa ham, todos.json doim skript yonida qoladi.

2-qadam: vazifa qo’shish

function addTodo(title) {
  if (!title) {
    console.log("Vazifa matnini yozing: node todo.js add \"matn\"");
    process.exit(1);
  }

  const todos = loadTodos();

  // Oxirgi raqamdan keyingisini olamiz
  const nextId = todos.length > 0 ? todos[todos.length - 1].id + 1 : 1;

  todos.push({ id: nextId, title, isDone: false });
  saveTodos(todos);

  console.log(`Qo'shildi [${nextId}]: ${title}`);
}

Matn berilmagan bo’lsa dastur process.exit(1) bilan to’xtaydi — bu xato holati.

3-qadam: ro’yxatni chiqarish

function listTodos() {
  const todos = loadTodos();

  if (todos.length === 0) {
    console.log("Ro'yxat bo'sh");
    return;
  }

  console.log("Vazifalar:");
  todos.forEach((todo) => {
    const mark = todo.isDone ? "[x]" : "[ ]";
    console.log(`${mark} ${todo.id}. ${todo.title}`);
  });
}

Bo’sh ro’yxat alohida tekshiriladi: foydalanuvchi “Vazifalar:” so’zidan keyin bo’sh joy ko’rmasin.

4-qadam: bajarilgan deb belgilash

function doneTodo(rawId) {
  const id = Number(rawId);

  if (!id) {
    console.log("Raqam yozing: node todo.js done 2");
    process.exit(1);
  }

  const todos = loadTodos();
  const todo = todos.find((item) => item.id === id);

  if (!todo) {
    console.log("Bunday vazifa yo'q:", id);
    process.exit(1);
  }

  todo.isDone = true;
  saveTodos(todos);

  console.log(`Bajarildi: ${todo.title}`);
}

Number(rawId) qatori muhim: process darsida ko’rilganidek, argument har doim satr bo’lib keladi. Aylantirmasangiz item.id === id solishtiruvi hech qachon true bo’lmaydi.

5-qadam: buyruqlarni ulash

Faylning oxiriga qo’shing:

const args = process.argv.slice(2);
const command = args[0];

if (command === "add") {
  addTodo(args[1]);
} else if (command === "list") {
  listTodos();
} else if (command === "done") {
  doneTodo(args[1]);
} else {
  console.log("Buyruqlar:");
  console.log("  node todo.js add \"matn\"");
  console.log("  node todo.js list");
  console.log("  node todo.js done <raqam>");
}

Noma’lum yoki bo’sh buyruqda yordam matni chiqadi — foydalanuvchi nima yozishni bilmay qolmaydi.

Ishlatib ko’ramiz

Buyruqsiz:

node todo.js
Buyruqlar:
  node todo.js add "matn"
  node todo.js list
  node todo.js done <raqam>

Ikkita vazifa qo’shamiz:

node todo.js add "Non sotib olish"
node todo.js add "Kitob o'qish"
Qo'shildi [1]: Non sotib olish
Qo'shildi [2]: Kitob o'qish

Ro’yxatni ko’ramiz:

node todo.js list
Vazifalar:
[ ] 1. Non sotib olish
[ ] 2. Kitob o'qish

Ikkinchisini bajarilgan deb belgilaymiz:

node todo.js done 2
Bajarildi: Kitob o'qish
node todo.js list
Vazifalar:
[ ] 1. Non sotib olish
[x] 2. Kitob o'qish

Xato holatlari

Yo’q raqam berilsa:

node todo.js done 99
Bunday vazifa yo'q: 99

Matnsiz add:

node todo.js add
Vazifa matnini yozing: node todo.js add "matn"

Ikkalasida ham chiqish kodi 1 bo’ladi.

Saqlangan fayl

todos.json ni oching:

[
  {
    "id": 1,
    "title": "Non sotib olish",
    "isDone": false
  },
  {
    "id": 2,
    "title": "Kitob o'qish",
    "isDone": true
  }
]

JSON.stringify(todos, null, 2) dagi 2 — shu chiroyli ko’rinish uchun. Usiz hammasi bitta qatorda chiqar edi.

Dasturni yaxshilash yo’llari

Loyiha ishlaydi, lekin o’sish uchun joy ko’p:

  1. delete buyrug’i — vazifani o’chirish, filter bilan;
  2. Funksiyalarni ajratishstorage.js va commands.js modullariga bo’lish;
  3. Rangli chiqish — bajarilganlarni boshqa rangda ko’rsatish;
  4. npm skriptpackage.json ga "todo": "node todo.js" qo’shib, npm run todo -- list shaklida chaqirish;
  5. Asinxron yozuvfs.promises va async/await ga o’tkazish.

Bo’limda nimalarni o’rgandingiz

Yo’lni orqaga qarab ko’ramiz:

Bilimni tekshirish

O’zingizni sinang — javobni eslay olmasangiz, tegishli darsga qaytish belgisi:

  1. process.argv ning 0 va 1-indekslarida nima turadi?
  2. Nega readFileSync server kodida ishlatilmaydi?
  3. path.join(__dirname, "data.json") va "data.json" orasidagi farq nimada?
  4. Tinglovchisi yo’q error hodisasi e’lon qilinsa nima bo’ladi?
  5. Promise.all ro’yxatidagi bitta amal xato bersa, natija qanday bo’ladi?
  6. Sof http modulida har if bloki nega return bilan tugaydi?

Loyihani baholash

Ishingiz tayyor deb hisoblanadi, agar:

  • uchala buyruq (add, list, done) ishlasa;
  • dastur yopilib qayta ochilganda ma’lumot saqlanib qolsa;
  • noto’g’ri argument berilganda tushunarli xabar chiqsa, yiqilish emas;
  • todos.json boshqa papkadan chaqirilganda ham to’g’ri topilsa;
  • kodda o’zbekcha nomli o’zgaruvchi yoki funksiya bo’lmasa.

Bundan keyin qayerga

Node.js bilan terminal vositasi yozdingiz va http moduli darsida serverni qo’lda ko’tardingiz. O’sha darsda kodning qanchalik uzayib ketganini ko’rdingiz: har javobda sarlavha, qo’lda JSON, uzun if zanjiri.

Bu muammo hammaga tanish — shuning uchun uni hal qiladigan vosita yaratilgan.

Keyingi bo’lim Express nima darsidan boshlanadi. U yerda xuddi shu server vazifasi qayta yoziladi va farqni o’z ko’zingiz bilan solishtirasiz. Node.js asoslari qo’lingizda bo’lgani uchun Express sehrli ko’rinmaydi: uning ichida nima ishlayotganini bilasiz.

Bu dars foydali bo'ldimi?

marta ko'rildi