3

child_process.spawn()Meteor メソッドで使用しようとしています。PID、stdout、stderr、および終了コードを外部プロセスから取得し、それらすべてをデータベースに保存したいと考えています。

insert()最初の呼び出しを追加するまで、すべてが機能しました。これによりinsert()、「ダミー」ドキュメントが 1 つだけデータベースに挿入されます。サーバー コンソールにエラー メッセージが表示されません。最初にそれをコメントアウトするとinsert()、他のinsert()呼び出しは成功します。

// server/app.js
var spawn = Npm.require('child_process').spawn;

Meteor.methods({
  start: function() {
    var child = spawn('ls', ['/tmp']);
    var pid = child.pid;

    var wrappedChildStdoutOn = Meteor.wrapAsync(child.stdout.on, child.stdout);
    var wrappedChildStderrOn = Meteor.wrapAsync(child.stderr.on, child.stderr);
    var wrappedChildOn = Meteor.wrapAsync(child.on, child);

    // this insert() breaks upcoming insert() calls!
    Stuff.insert({pid: pid, date: new Date(), type: 'dummy', data: 'dummy'});

    wrappedChildStdoutOn('data',  function (data) {
      Stuff.insert({pid: pid, date: new Date(), type: 'stdout', data: data.toString()});
    });

    wrappedChildStderrOn('data', function (data) {
      Stuff.insert({pid: pid, date: new Date(), type: 'stderr', data: data.toString()});
    });

    wrappedChildOn('exit', function (code) {
      Stuff.insert({pid: pid, date: new Date(), type: 'exit', code: code});
    });
  }
});

その最初のinsert()電話はどうしたの?

この問題を示す Meteor アプリを次に示します。

4

1 に答える 1