23

を使用してnode.jsスクリプト内から実行しているPhantomJS/CasperJSスクリプトがありますprocess.spawn()require()CasperJSはモジュールのサポートをサポートしていないため、CasperJSからコマンドを出力しstdout、node.jsスクリプトからコマンドを読み込んで、spawn.stdout.on('data', function(data) {});redis / mongooseにオブジェクトを追加するなどの操作を実行しようとしています(複雑ですが、そうですが、このためのWebサービスを設定するよりも簡単です...)CasperJSスクリプトは一連のコマンドを実行し、たとえば、データベースに追加する必要のある20のスクリーンショットを作成します。

dataしかし、変数(a ?)を行に分割する方法がわかりませんBuffer...文字列に変換してから置換を実行しようとしましspawn.stdout.setEncoding('utf8');たが、何も機能しないようです...

これが私が今持っているものです

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

4

6 に答える 6

19

これを試して:

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.
  }
});

「データ」イベントは出力の行間で必ずしも均等に分割されるとは限らないため、1 行が複数のデータ イベントにまたがる場合があることに注意してください。

于 2012-03-20T04:20:09.023 に答える
13

私は実際にまさにこの目的のために Node ライブラリを作成しました。これは stream-splitter と呼ばれ、Github で見つけることができます: samcday/stream-splitter

ライブラリは、Streamキャスパー stdout を区切り文字 (この場合は \n) と共にパイプできる特別なものを提供tokenし、 input から分割された行ごとに 1 つずつ、適切なイベントを発行しますStream。このための内部実装は非常に単純で、魔法のほとんどをサブスタック/ノード バッファに委譲します。つまり、不要なBuffer割り当て/コピーがないことを意味します。

于 2012-07-07T07:06:07.070 に答える