3

どのプラットフォームの隕石でもノードの childprocess.spawn() を使用して成功した人はいますか? 次のように OS X と Windows の両方で試してみましたが、アプリはすぐにクラッシュします。

if (Meteor.isServer) {
  Meteor.startup(function() {
    cmd = __meteor_bootstrap__.require('child_process').spawn('irb', [], {detached: true, stdio:'pipe'});
    cmd.stdout.on('data', function(data){
      Fiber(function(){
        Replies.remove({});
        Replies.insert({message: data});
      }).run();
    });

 });
}

コンソールに、OS X では次のメッセージが表示され、Windows では同様のメッセージが表示されます。

Assertion failed: (handle->InternalFieldCount() > 0), function Unwrap, file ../src/node_object_wrap.h, line 61.
Exited from signal: SIGABRT

誰か考えがありますか?

ありがとう!
-グレッグ

4

1 に答える 1

1

dataコレクションに挿入できないノードBufferです。最初に文字列に変換します。

また、子プロセスからデータがストリーミングされるときに、データ イベント コールバックが複数回呼び出されることにも注意してください (出力が小さすぎて 1 つのバッファーですべてを取得する場合を除きます)。データをバッファに蓄積し、ストリーム終了イベントを取得したときにコレクションに挿入する必要があります。

子プロセスが utf-8 (純粋な ASCII 以外のもの) を出力する可能性がある場合は、まずデータをノード Buffer に蓄積してから、各チャンク変換するのではなく、Buffer 全体を文字列に変換してください。データを文字列に変換し、データを文字列として蓄積します。(utf-8 文字は複数のバイトにまたがる可能性があるため、バイト ストリームを任意の断片に分割して、各断片を utf-8 として個別に解析することはできません)。

于 2013-01-21T15:49:23.737 に答える