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