Menu
CoddyTech

Lire les entrées

Fait partie de la section Les bases de Node.js du Journey Node.js de Coddy. Leçon 30 sur 33.

Ajouter des notes une commande à la fois est lent lorsque la liste existe déjà ailleurs.

Un programme peut également lire l’entrée depuis stdin : du texte saisi au clavier ou transmis depuis un fichier. Sur un ordinateur portable, cat numbers.txt | node sum.js envoie un fichier vers stdin ; | s’appelle un tube. for await (const chunk of process.stdin) le lit morceau par morceau jusqu’à la fin. Joignez les morceaux, puis séparez-les en lignes.

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

Ici, la boîte Input du terminal alimente stdin. Le texte se termine généralement par un saut de ligne, donc la dernière ligne est vide : supprimez les lignes vides.

challenge icon

Défi

Facile

Saisir les notes une par une avec add prend du temps quand tu as déjà une liste quelque part. Ajoute une commande import qui lit plusieurs notes à la fois depuis l’entrée du programme, stdin.

  1. Dans notes.js, ajoute une commande import. Lis tout stdin dans une seule chaîne avec for await, comme le montre la leçon.
  2. Découpe le texte en lignes. Supprime les espaces au début et à la fin de chaque ligne, et ignore les lignes vides après cette suppression.
  3. Ajoute chaque ligne restante comme note avec store.add, en attendant la fin de chaque opération. Ton écouteur added affiche toujours une ligne Saved note pour chaque note. C’est normal.
  4. Enfin, affiche Imported , le nombre de notes ajoutées, puis notes.. Avec cette entrée :
    Buy bread
    Call the bank
    
    Water the plants
    node notes.js import enregistre les trois lignes comme notes. Il affiche trois lignes Saved note, puis, à la fin :
    Imported 3 notes.
    Sans aucune entrée, il affiche seulement :
    Imported 0 notes.

Essaie : clique sur le bouton Input à côté de Run. Une zone s’ouvre sous les arguments. Saisis-y trois lignes, avec une ligne vide entre deux d’entre elles. Saisis import dans la zone après $ node notes.js, puis appuie sur Entrée. Ensuite, vide la zone Input et exécute de nouveau import : tu verras Imported 0 notes..

Essayez vous-même

// Votre outil de prise de notes commence ici.
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);
}

Toutes les leçons de Les bases de Node.js

Entraînez-vous par vous-même : Playground Express