Leer la entrada
Parte de la sección Conceptos básicos de Node.js del Journey de Node.js de Coddy. Lección 30 de 33.
Agregar notas un comando a la vez es lento cuando la lista ya existe en otro lugar.
Un programa también puede leer la entrada desde stdin: texto escrito con el teclado o enviado desde un archivo. En una laptop, cat numbers.txt | node sum.js envía un archivo a stdin; | se llama tubería. for await (const chunk of process.stdin) lo lee pieza por pieza hasta que termina. Une las piezas y después divídelas en líneas.
// 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));Aquí, el cuadro de entrada de la terminal llena stdin. El texto suele terminar con un salto de línea, así que la última línea está vacía: descarta las líneas vacías.
Desafío
FácilEscribir notas con add de una en una es lento cuando ya tienes una lista en alguna parte. Añade un comando import que lea muchas notas a la vez desde la entrada del programa, stdin.
- En
notes.js, añade un comandoimport. Lee todo stdin en una sola cadena confor await, como muestra la lección. - Divide el texto en líneas. Elimina los espacios al principio y al final de cada línea, y omite las líneas que queden vacías después de eliminar los espacios.
- Añade cada línea restante como una nota con
store.add, esperando a que se añada cada una. Tu listeneraddedseguirá imprimiendo una líneaSaved notepor cada nota. Es lo esperado. - Por último, imprime
Imported, el número de notas añadidas ynotes.. Con esta entrada:Buy bread Call the bank Water the plantsnode notes.js importguarda las tres líneas como notas. Imprime tres líneasSaved notey, por último:Si no hay ninguna entrada, imprime solo:Imported 3 notes.Imported 0 notes.
Pruébalo: haz clic en el botón Input junto a Run. Se abrirá un cuadro debajo de los argumentos. Escribe tres líneas en él, con una línea vacía entre dos de ellas. Escribe import en el cuadro después de $ node notes.js y pulsa Enter. Luego vacía el cuadro Input y ejecuta import otra vez: verás Imported 0 notes..
Pruébalo tú mismo
// Tu herramienta de notas comienza aquí.
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 las lecciones de Conceptos básicos de Node.js
Practica por tu cuenta: Playground de Express