Menu
CoddyTech

Lendo a entrada

Parte da seção Fundamentos de Node.js do Journey de Node.js da Coddy. Lição 30 de 33.

Adicionar notas, um comando por vez, é lento quando a lista já existe em outro lugar.

Um programa também pode ler a entrada de stdin: texto digitado no teclado ou enviado de um arquivo. Em um laptop, cat numbers.txt | node sum.js envia um arquivo para stdin; | é chamado de pipe. for await (const chunk of process.stdin) lê o conteúdo aos poucos até o fim. Junte as partes e, em seguida, divida-as em linhas.

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

Aqui, a caixa Input do terminal preenche stdin. O texto geralmente termina com uma quebra de linha, então a última linha fica vazia: descarte as linhas vazias.

challenge icon

Desafio

Fácil

Digitar notas com um add de cada vez é lento quando você já tem uma lista em algum lugar. Adicione um comando import que leia várias notas de uma só vez a partir da entrada do programa, stdin.

  1. Em notes.js, adicione um comando import. Leia todo o stdin em uma única string usando for await, como a lição mostra.
  2. Divida o texto em linhas. Remova os espaços do início e do fim de cada linha e ignore as linhas que ficarem vazias após a remoção dos espaços.
  3. Adicione cada linha restante como uma nota com store.add, aguardando cada uma. Seu listener added ainda imprime uma linha Saved note para cada nota. Isso é esperado.
  4. Por último, imprima Imported , o número de notas adicionadas e notes.. Com esta entrada:
    Buy bread
    Call the bank
    
    Water the plants
    node notes.js import salva as três linhas como notas. Ele imprime três linhas Saved note e, por último:
    Imported 3 notes.
    Sem nenhuma entrada, ele imprime apenas:
    Imported 0 notes.

Experimente: clique no botão Input ao lado de Run. Uma caixa aparece abaixo dos argumentos. Digite três linhas nela, com uma linha vazia entre duas delas. Digite import na caixa depois de $ node notes.js e pressione Enter. Em seguida, esvazie a caixa Input e execute import novamente: você verá Imported 0 notes..

Experimente você mesmo

// Sua ferramenta de anotações começa aqui.
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);
}

Todas as lições de Fundamentos de Node.js

Pratique por conta própria: Playground de Express