J'écris un programme dans Node.js qui (dans certaines situations) veut agir comme un simple filtre: tout lire depuis stdin (jusqu'à la fin du fichier), faire un peu de traitement, écrire le résultat dans stdout.
Comment faites-vous la partie "tout lire depuis stdin"? Les solutions les plus proches que j'ai trouvées jusqu'à présent semblent fonctionner soit pour une ligne à la fois à partir de la console, soit uniquement lorsque stdin est un fichier et non un tube.
Ma plaque chauffante pour celle-ci ressemble beaucoup à la solution décrite dans un commentaire ci-dessus - l'offrir au plus haut niveau car c'est la manière la plus simple de le faire et elle ne devrait pas être uniquement dans un commentaire.
var fs = require('fs');
var data = fs.readFileSync(0, 'utf-8');
// Data now points to a buffer containing the file's contents
Si vous êtes sous Linux, il n'est pas nécessaire d'avoir un paquet tiers pour cela. bien sûr, tenez compte de vos besoins de performances, mais ces deux lignes fonctionneront:
const fs = require("fs");
const data = fs.readFileSync("/dev/stdin", "utf-8");
Jan souligne dans les commentaires ci-dessous qu'une solution plus portable serait d'utiliser 0
, car il s'agit de la norme POSIX. Donc, vous pouvez simplement utiliser:
const fs = require("fs");
const data = fs.readFileSync(0, "utf-8");
data
est maintenant une chaîne avec vos données de stdin, interprétée comme utf 8
get-stdin fera l'affaire.
Quelques notes lisant entre les lignes de votre question.
Puisque vous avez marqué la question "synchrone", je noterai simplement que stdin est uniquement asynchrone dans node.js. La bibliothèque ci-dessus est la plus simple possible. Il traitera l'intégralité de l'entrée comme une chaîne ou un tampon.
Si possible, il est préférable d'écrire votre programme dans le style de streaming, mais certains cas d'utilisation sont réalisables pour le streaming (c'est-à-dire le nombre de mots) et d'autres pas (c'est-à-dire inverser l'entrée).
De plus, "une ligne à la fois depuis la console" est un artefact du terminal qui met en mémoire tampon vos frappes. Si vous voulez des détails sur le niveau "Je suis désolé, j'ai demandé", consultez l'incroyable le TTY démystifié .
J'utilise ce qui suit dans Node 11+
async function read(stream) {
let buffer = Buffer.alloc(0);
for await (const chunk of stream) {
buffer = Buffer.concat([buffer, chunk]);
}
return buffer.toString('utf8');
}
Usage:
const input = await read(process.stdin);