为什么insert()会破坏wrapAsync';Meteor方法中的d child_process.spawn()处理程序?

为什么insert()会破坏wrapAsync';Meteor方法中的d child_process.spawn()处理程序?,meteor,node-fibers,Meteor,Node Fibers,我试图在Meteor方法中使用child\u process.spawn()。我想从外部进程捕获PID、stdout、stderr和exit代码,并将所有这些代码存储在数据库中 在我添加第一个insert()调用之前,一切正常。使用该insert(),只有一个“虚拟”文档被插入到数据库中。我在服务器控制台中没有收到错误消息。如果我注释掉第一个insert(),那么另一个insert()调用将成功 // server/app.js var spawn = Npm.require('child_pr

我试图在Meteor方法中使用
child\u process.spawn()
。我想从外部进程捕获PID、stdout、stderr和exit代码,并将所有这些代码存储在数据库中

在我添加第一个
insert()
调用之前,一切正常。使用该
insert()
,只有一个“虚拟”文档被插入到数据库中。我在服务器控制台中没有收到错误消息。如果我注释掉第一个
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()
调用是怎么回事


.

insert需要一些时间,因此
ls
insert
完成之前完成其输出。当您将事件处理程序放置到位时,已经太晚了


您可以通过将第一个
insert
移动到末尾,将第一个
insert
移动到
spawn
调用之前,或者向
insert
调用添加一个no-op
函数(){}
回调来解决这个问题,因此它被异步调用。

啊,当然!Meteor确保在
insert()
完成之前不会执行以下行。谢谢