Menu
CoddyTech

Leggere l'input

Fa parte della sezione Fondamenti di Node.js del percorso Node.js di Coddy. Lezione 30 di 33.

Aggiungere note un comando alla volta è lento quando l’elenco esiste già da qualche altra parte.

Un programma può anche leggere l’input da stdin: testo digitato sulla tastiera o inviato da un file. Su un laptop, cat numbers.txt | node sum.js invia un file a stdin; | si chiama pipe. for await (const chunk of process.stdin) lo legge un pezzo alla volta finché non termina. Unisci i pezzi, poi suddividili in righe.

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

Qui, la casella di input del terminale riempie stdin. Il testo di solito termina con un carattere di nuova riga, quindi l’ultima riga è vuota: elimina le righe vuote.

challenge icon

Sfida

Facile

Digitare le note una add alla volta è lento quando hai già un elenco da qualche parte. Aggiungi un comando import che legga molte note in una volta dall'input del programma, stdin.

  1. In notes.js, aggiungi un comando import. Leggi tutto stdin in un'unica stringa con for await, come mostra la lezione.
  2. Dividi il testo in righe. Rimuovi gli spazi all'inizio e alla fine di ogni riga e salta le righe vuote dopo la rimozione degli spazi.
  3. Aggiungi ogni riga rimanente come nota con store.add, aspettando ogni aggiunta. Il listener added continua a stampare una riga Saved note per ogni nota. È previsto.
  4. Infine, stampa Imported , il numero di note aggiunte e notes.. Con questo input:
    Buy bread
    Call the bank
    
    Water the plants
    node notes.js import salva le tre righe come note. Stampa tre righe Saved note, poi, infine:
    Imported 3 notes.
    Senza alcun input, stampa solo:
    Imported 0 notes.

Prova: fai clic sul pulsante Input accanto a Run. Si apre un riquadro sotto gli argomenti. Digita al suo interno tre righe, lasciandone una vuota tra due di esse. Digita import nel riquadro dopo $ node notes.js e premi Invio. Poi svuota il riquadro Input ed esegui di nuovo import: vedrai Imported 0 notes..

Provalo tu

// Il tuo strumento per gli appunti inizia qui.
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);
}

Tutte le lezioni di Fondamenti di Node.js

Esercitati da solo: Playground Express