update tutorial node framework ejemplos actualizar node.js phantomjs

node.js - tutorial - npm



Analice la salida del proceso del nodo originado.js línea por línea (4)

Tengo un script PhantomJS / CasperJS que estoy ejecutando desde un script node.js usando process.spawn() . Dado que CasperJS no admite módulos que require() , estoy intentando imprimir comandos de CasperJS a stdout y luego leerlos desde mi script spawn.stdout.on(''data'', function(data) {}); usando spawn.stdout.on(''data'', function(data) {}); para hacer cosas como agregar objetos a redis / mongoose (complicado, sí, pero parece más sencillo que configurar un servicio web para esto ...) El script CasperJS ejecuta una serie de comandos y crea, por ejemplo, 20 capturas de pantalla que necesitan para ser añadido a mi base de datos.

Sin embargo, no puedo averiguar cómo dividir la variable de data (¿un Buffer ?) En líneas ... He intentado convertirla en una cadena y luego hacer una sustitución, he intentado hacer spawn.stdout.setEncoding(''utf8''); Pero nada parece funcionar...

Esto es lo que tengo ahora mismo.

var spawn = require(''child_process'').spawn; var bin = "casperjs" //googlelinks.js is the example given at http://casperjs.org/#quickstart var args = [''scripts/googlelinks.js'']; var cspr = spawn(bin, args); //cspr.stdout.setEncoding(''utf8''); cspr.stdout.on(''data'', function (data) { var buff = new Buffer(data); console.log("foo: " + buff.toString(''utf8'')); }); cspr.stderr.on(''data'', function (data) { data += ''''; console.log(data.replace("/n", "/nstderr: ")); }); cspr.on(''exit'', function (code) { console.log(''child process exited with code '' + code); process.exit(code); });

https://gist.github.com/2131204


Agregando a la respuesta de maerics, que no trata adecuadamente los casos en que solo una parte de una línea se alimenta en un volcado de datos (la suya le dará la primera parte y la segunda parte de la línea individualmente, como dos líneas separadas).

var _breakOffFirstLine = //r?/n/ function filterStdoutDataDumpsToTextLines(callback){ //returns a function that takes chunks of stdin data, aggregates it, and passes lines one by one through to callback, all as soon as it gets them. var acc = '''' return function(data){ var splitted = data.toString().split(_breakOffFirstLine) var inTactLines = splitted.slice(0, splitted.length-1) var inTactLines[0] = acc+inTactLines[0] //if there was a partial, unended line in the previous dump, it is completed by the first section. acc = splitted[splitted.length-1] //if there is a partial, unended line in this dump, store it to be completed by the next (we assume there will be a terminating newline at some point. This is, generally, a safe assumption.) for(var i=0; i<inTactLines.length; ++i){ callback(inTactLines[i]) } } }

uso:

process.stdout.on(''data'', filterStdoutDataDumpsToTextLines(function(line){ //each time this inner function is called, you will be getting a single, complete line of the stdout ^^ }) )


De hecho, he escrito una biblioteca de Nodos exactamente para este propósito, se llama stream-splitter y puedes encontrarla en Github: samcday/stream-splitter .

La biblioteca proporciona un Stream especial en el que puede canalizar la salida estándar de casper, junto con un delimitador (en su caso, / n), y emitirá eventos de token ordenados, uno por cada línea que se haya separado del Stream entrada. La implementación interna para esto es muy simple, y delega la mayor parte de la magia a los substack/node-buffers de substack/node-buffers que significa que no hay asignaciones / copias de Buffer innecesarias.


Prueba esto:

cspr.stdout.setEncoding(''utf8''); cspr.stdout.on(''data'', function(data) { var str = data.toString(), lines = str.split(/(/r?/n)/g); for (var i=0; i<lines.length; i++) { // Process the line, noting it might be incomplete. } });

Tenga en cuenta que el evento "datos" no necesariamente se divide uniformemente entre las líneas de salida, por lo que una sola línea puede abarcar múltiples eventos de datos.


Puedes intentarlo. Ignorará las líneas vacías o los nuevos saltos de línea vacíos.

cspr.stdout.on(''data'', (data) => { data = data.toString().split(/(/r?/n)/g); data.forEach((item, index) => { if (data[index] !== ''/n'' && data[index] !== '''') { console.log(data[index]); } }); });