I have a PhantomJS/CasperJS script which I'm running from within a node.js script using process.spawn()
. Since CasperJS doesn't support require()
ing modules, I'm trying to print commands from CasperJS to stdout
and then read them in from my node.js script using spawn.stdout.on('data', function(data) {});
in order to do things like add objects to redis/mongoose (convoluted, yes, but seems more straightforward than setting up a web service for this...) The CasperJS script executes a series of commands and creates, say, 20 screenshots which need to be added to my database.
However, I can't figure out how to break the data
variable (a Buffer
?) into lines... I've tried converting it to a string and then doing a replace, I've tried doing spawn.stdout.setEncoding('utf8');
but nothing seems to work...
Here is what I have right now
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
Try this:
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. } });
Note that the "data" event might not necessarily break evenly between lines of output, so a single line might span multiple data events.
I've actually written a Node library for exactly this purpose, it's called stream-splitter and you can find it on Github: samcday/stream-splitter.
The library provides a special Stream
you can pipe your casper stdout into, along with a delimiter (in your case, \n), and it will emit neat token
events, one for each line it has split out from the input Stream
. The internal implementation for this is very simple, and delegates most of the magic to substack/node-buffers which means there's no unnecessary Buffer
allocations/copies.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With