Menu
CoddyTech

Odczytywanie danych wejściowych

Część sekcji Podstawy Node.js ścieżki Node.js w Coddy. Lekcja 30 z 33.

Dodawanie notatek po jednym poleceniu jest powolne, gdy lista już istnieje gdzieś indziej.

Program może też odczytywać dane wejściowe ze stdin: tekst wpisany z klawiatury lub przesłany z pliku. Na laptopie polecenie cat numbers.txt | node sum.js przesyła plik do stdin; | nazywa się potokiem. for await (const chunk of process.stdin) odczytuje dane fragment po fragmencie, aż do końca. Połącz fragmenty, a następnie podziel je na wiersze.

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

Tutaj pole Input w terminalu wypełnia stdin. Tekst zwykle kończy się znakiem nowej linii, więc ostatni wiersz jest pusty: usuń puste wiersze.

challenge icon

Wyzwanie

Łatwy

Wpisywanie notatek pojedynczo za pomocą add jest powolne, gdy masz już gdzieś ich listę. Dodaj polecenie import, które odczytuje wiele notatek naraz ze standardowego wejścia programu (stdin).

  1. W pliku notes.js dodaj polecenie import. Odczytaj całe stdin do jednego ciągu znaków za pomocą for await, tak jak pokazano w lekcji.
  2. Podziel tekst na wiersze. Usuń spacje z początku i końca każdego wiersza, a następnie pomiń wiersze, które po usunięciu spacji są puste.
  3. Dodaj każdy pozostały wiersz jako notatkę za pomocą store.add, za każdym razem czekając na zakończenie operacji. Nasłuchiwacz added nadal będzie wyświetlał wiersz Saved note dla każdej notatki. Tak powinno być.
  4. Na koniec wyświetl Imported , liczbę dodanych notatek i notes.. Przy takim wejściu:
    Buy bread
    Call the bank
    
    Water the plants
    node notes.js import zapisuje te trzy wiersze jako notatki. Wyświetla trzy wiersze Saved note, a na końcu:
    Imported 3 notes.
    Jeśli nie podasz żadnego wejścia, wyświetli tylko:
    Imported 0 notes.

Wypróbuj: kliknij przycisk Input obok Run. Pod argumentami otworzy się pole. Wpisz w nim trzy wiersze, pozostawiając pusty wiersz między dwoma z nich. Wpisz import w polu po $ node notes.js i naciśnij Enter. Następnie opróżnij pole Input i ponownie uruchom import: zobaczysz Imported 0 notes..

Spróbuj swoich sił

// Twoje narzędzie do notatek zaczyna się tutaj.
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);
}

Wszystkie lekcje w sekcji Podstawy Node.js

Poćwicz samodzielnie: Edytor online Express