Menu
CoddyTech

קריאת קלט

חלק מהיחידה יסודות Node.js במסלול ה-Node.js של Coddy. שיעור 30 מתוך 33.

הוספת הערות פקודה אחת בכל פעם היא איטית, כשהרשימה כבר קיימת במקום אחר.

תוכנית יכולה גם לקרוא קלט מ-stdin: טקסט שמוקלד במקלדת, או נשלח מקובץ. במחשב נייד, cat numbers.txt | node sum.js שולח קובץ אל 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. טקסט מסתיים בדרך כלל בתו newline, ולכן השורה האחרונה ריקה: הסירו שורות ריקות.

challenge icon

אתגר

קל

הקלדת הערות אחת בכל פעם באמצעות add היא איטית כשכבר יש לך רשימה במקום כלשהו. הוסף פקודת import שקוראת הערות רבות בבת אחת מקלט התוכנית, stdin.

  1. ב־notes.js, הוסף פקודת import. קרא את כל stdin למחרוזת אחת באמצעות for await, כפי שמוצג בשיעור.
  2. פצל את הטקסט לשורות. הסר את הרווחים מתחילת כל שורה ומסופה, ודלג על שורות שנותרו ריקות לאחר הסרת הרווחים.
  3. הוסף כל שורה שנותרה כהערה באמצעות store.add, והמתן להשלמת כל אחת. מאזין added שלך עדיין מדפיס שורת Saved note עבור כל הערה. זה צפוי.
  4. לבסוף, הדפס Imported , את מספר ההערות שנוספו, ואת notes.. עם הקלט הזה:
    Buy bread
    Call the bank
    
    Water the plants
    node notes.js import שומר את שלוש השורות כהערות. הוא מדפיס שלוש שורות Saved note, ואז, לבסוף:
    Imported 3 notes.
    בלי שום קלט, הוא מדפיס רק:
    Imported 0 notes.

נסה זאת: לחץ על כפתור Input שליד Run. תיבה נפתחת מתחת לארגומנטים. הקלד בה שלוש שורות, עם שורה ריקה בין שתיים מהן. הקלד import בתיבה שאחרי $ node notes.js והקש Enter. לאחר מכן רוקן את תיבת Input והרץ שוב את import: תראה Imported 0 notes..

נסו בעצמכם

// כלי הפתקים שלך מתחיל כאן.
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

תרגלו בעצמכם: Express אונליין