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.