write with nodejs node example javascript node.js stream stdin ringojs

with - video streaming javascript example



¿Cómo leer una secuencia de texto completa en node.js? (4)

Como node.js está orientado a eventos y flujos, no hay API para esperar hasta el final del resultado estándar y del búfer, pero es fácil hacerlo manualmente

var content = ''''; process.stdin.resume(); process.stdin.on(''data'', function(buf) { content += buf.toString(); }); process.stdin.on(''end'', function() { // your code here console.log(content.split('''').reverse().join('''')); });

En la mayoría de los casos, es mejor no almacenar en búfer los datos y procesar los fragmentos entrantes a medida que llegan (utilizando una cadena de analizadores de flujo ya disponibles como xml o zlib o su propio analizador FSM)

En RingoJS hay una function llamada read que le permite leer una secuencia completa hasta que se llega al final. Esto es útil cuando estás haciendo una aplicación de línea de comandos. Por ejemplo, puede escribir un program tac siguiente manera:

#!/usr/bin/env ringo var string = system.stdin.read(); // read the entire input stream var lines = string.split("/n"); // split the lines lines.reverse(); // reverse the lines var reversed = lines.join("/n"); // join the reversed lines system.stdout.write(reversed); // write the reversed lines

Esto le permite iniciar una shell y ejecutar el comando tac . Luego escribe todas las líneas que desees y, una vez que hayas terminado, puedes presionar Ctrl + D (o Ctrl + Z en Windows) para indicar el final de la transmisión .

Quiero hacer lo mismo en node.js pero no puedo encontrar ninguna función que lo haga. Pensé en usar la function readSync de la biblioteca fs para simular de la siguiente manera, pero fue en vano:

fs.readSync(0, buffer, 0, buffer.length, null);

El descriptor de archivo para stdin (el primer argumento) es 0 . Por eso debería leer los datos del teclado. En su lugar me da el siguiente error:

Error: ESPIPE, invalid seek at Object.fs.readSync (fs.js:381:19) at repl:1:4 at REPLServer.self.eval (repl.js:109:21) at rli.on.self.bufferedCmd (repl.js:258:20) at REPLServer.self.eval (repl.js:116:5) at Interface.<anonymous> (repl.js:248:12) at Interface.EventEmitter.emit (events.js:96:17) at Interface._onLine (readline.js:200:10) at Interface._line (readline.js:518:8) at Interface._ttyWrite (readline.js:736:14)

¿Cómo recopilaría sincrónicamente todos los datos en una secuencia de texto de entrada y los devolvería como una cadena en node.js? Un ejemplo de código sería muy útil.


Déjame ilustrar la respuesta de StreetStrider.

Aquí es cómo hacerlo con concat-stream

var concat = require(''concat-stream''); yourStream.pipe(concat(function(buf){ // buf is a Node Buffer instance which contains the entire data in stream // if your stream sends textual data, use buf.toString() to get entire stream as string var streamContent = buf.toString(); doSomething(streamContent); })); // error handling is still on stream yourStream.on(''error'',function(err){ console.error(err); });

Tenga en cuenta que process.stdin es una corriente.


Hay un módulo para esa tarea en particular, llamado concat-stream .


La clave es usar estos dos eventos Stream:

Event: ''data'' Event: ''end''

Para stream.on(''data'', ...) debe recopilar sus datos en un búfer (si es binario) o en una cadena.

Para on(''end'', ...) debe llamar a una devolución de llamada con el búfer completado, o si puede integrarlo y usar el retorno utilizando una biblioteca de Promesas.