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:
deletebuyrug’i — vazifani o’chirish,filterbilan;- Funksiyalarni ajratish —
storage.jsvacommands.jsmodullariga bo’lish; - Rangli chiqish — bajarilganlarni boshqa rangda ko’rsatish;
npmskript —package.jsonga"todo": "node todo.js"qo’shib,npm run todo -- listshaklida chaqirish;- Asinxron yozuv —
fs.promisesvaasync/awaitga o’tkazish.
Bo’limda nimalarni o’rgandingiz
Yo’lni orqaga qarab ko’ramiz:
- Node.js nima — JavaScript brauzersiz ishlaydi;
- O’rnatish va REPL —
nodebuyrug’i va birinchi fayl; - npm va package.json — tayyor paketlar;
- Modul tizimi — kodni fayllarga bo’lish;
- fs va path — disk bilan ishlash;
- process — argument va muhit;
- Asinxron kod —
async/awaitvaPromise.all; - EventEmitter va oqimlar — hodisalar va katta ma’lumot;
- http moduli — so’rovni qabul qiladigan server.
Bilimni tekshirish
O’zingizni sinang — javobni eslay olmasangiz, tegishli darsga qaytish belgisi:
process.argvning 0 va 1-indekslarida nima turadi?- Nega
readFileSyncserver kodida ishlatilmaydi? path.join(__dirname, "data.json")va"data.json"orasidagi farq nimada?- Tinglovchisi yo’q
errorhodisasi e’lon qilinsa nima bo’ladi? Promise.allro’yxatidagi bitta amal xato bersa, natija qanday bo’ladi?- Sof
httpmodulida harifbloki negareturnbilan 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.jsonboshqa 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.