Menu
CoddyTech

قراءة الإدخال

جزء من قسم أساسيات Node.js في رحلة Node.js على Coddy. الدرس 21 من 24.

إضافة الملاحظات أمرًا واحدًا في كل مرة بطيئة عندما تكون القائمة موجودة بالفعل في مكان آخر.

يمكن للبرنامج قراءة الإدخال من stdin، وهو التدفق الذي يملؤه الأنبوب أو لوحة المفاتيح. تقرأ for await (const chunk of process.stdin) البيانات جزءًا بعد جزء حتى تنتهي. اجمع الأجزاء، ثم قسّمها إلى أسطر.

// cat numbers.txt | node sum.js
let input = '';
for await (const chunk of process.stdin) {
    input += chunk;
}
const numbers = input.split('\n').filter((line) => line !== '').map(Number);
console.log(numbers.reduce((a, b) => a + b, 0));

هنا يملأ مربع الإدخال في الطرفية stdin. ينتهي النص عادةً بمحرف سطر جديد، لذا يكون السطر الأخير فارغًا: احذف الأسطر الفارغة.

challenge icon

التحدي

سهل
  • يقرأ node notes.js import الإدخال، ويحفظ ملاحظة واحدة لكل سطر، ويطبع Imported 3 notes..
  • يتم تخطي الأسطر الفارغة، وتُحذف المسافات المحيطة بالسطر.

اكتب ثلاثة أسطر في مربع الإدخال، مع ترك سطر فارغ بين سطرين منها، وشغّل node notes.js import. ثم شغّله والمربع فارغ.

جرّب بنفسك

// تبدأ أداة ملاحظاتك من هنا.
import { rmSync } from 'node:fs';
import path from 'node:path';
import { formatNote } from './format.js';
import stats from './legacy/stats.cjs';
import store from './store.js';

const [command, ...words] = process.argv.slice(2);
const text = words.join(' ');

store.on('added', (note, n) => {
    console.log(`Saved note ${n}.`);
});

const noteNumber = (word) => {
    const n = Number(word);
    if (!Number.isInteger(n) || n < 1 || n > store.notes.length) {
        console.error(`No note ${word}`);
        process.exit(1);
    }
    return n;
};

if (command === 'add') {
    await store.add(text);
} else if (command === 'list') {
    const owner = process.env.NOTES_OWNER ?? 'you';
    console.log(`Notes for ${owner}`);
    if (store.notes.length === 0) {
        console.log('No notes yet');
    }
    const lines = store.notes.map((note, i) => formatNote(i + 1, note));
    if (store.settings.sort === 'newest') {
        lines.reverse();
    }
    lines.forEach((line) => console.log(line));
} else if (command === 'where') {
    const file = path.join(process.cwd(), 'notes.json');
    console.log(file);
    console.log(path.basename(file));
} else if (command === 'stats') {
    console.log(`${store.notes.length} notes, ${stats.countWords(store.notes)} words`);
} else if (command === 'done') {
    const removed = await store.remove(noteNumber(words[0]));
    console.log(`Done: ${removed}`);
} else if (command === 'remind') {
    const note = store.notes[noteNumber(words[0]) - 1];
    let count = 3;
    const timer = setInterval(() => {
        if (count > 0) {
            console.log(count);
            count -= 1;
        } else {
            console.log(note);
            clearInterval(timer);
        }
    }, 200);
} else if (command === 'clear') {
    rmSync('notes.json', { force: true });
    console.log('Deleted notes.json');
} else {
    if (command) {
        console.error(`Unknown command: ${command}`);
    }
    console.error('Usage: node notes.js <command> [words]');
    process.exit(1);
}

جميع دروس أساسيات Node.js