Menu
CoddyTech

Eingaben lesen

Teil des Abschnitts Node.js-Grundlagen der Node.js-Journey von Coddy. Lektion 21 von 24.

Notizen einzeln über die Befehlszeile hinzuzufügen, ist langsam, wenn die Liste bereits an anderer Stelle existiert.

Ein Programm kann Eingaben von stdin lesen, dem Datenstrom, der von einer Pipe oder der Tastatur befüllt wird. for await (const chunk of process.stdin) liest ihn Stück für Stück, bis er endet. Füge die Stücke zusammen und teile sie dann in Zeilen auf.

// 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));

Hier befüllt das Eingabefeld des Terminals stdin. Text endet normalerweise mit einem Zeilenumbruch, daher ist die letzte Zeile leer: Entferne leere Zeilen.

challenge icon

Aufgabe

Einfach
  • node notes.js import liest seine Eingabe ein, speichert eine Notiz pro Zeile und gibt Imported 3 notes. aus.
  • Leere Zeilen werden übersprungen, und Leerzeichen am Anfang und Ende einer Zeile werden entfernt.

Gib drei Zeilen in das Eingabefeld ein, mit einer Leerzeile zwischen zwei davon, und führe node notes.js import aus. Führe es anschließend mit leerem Feld aus.

Probier es selbst

// Dein Notiztool beginnt hier.
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);
}

Alle Lektionen in Node.js-Grundlagen