meteor中的child_process.spawn

时间:2013-01-21 03:37:19

标签: meteor

在任何平台上的meteor上使用node的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

有没有人有任何想法?

谢谢!
-Greg

1 个答案:

答案 0 :(得分:1)

data是一个节点Buffer,无法插入集合中;首先将它转换为字符串。

另请注意,当数据从子进程流式传输时,将多次调用您的数据事件回调(除非输出太小,以至于您碰巧在一个缓冲区中获取了所有内容)。您需要在缓冲区中累积数据,然后在获得流结束事件时将其插入到集合中。

如果你的子进程有可能输出utf-8(纯ASCII以外的任何东西),请确保首先在节点Buffer中累积数据,然后然后转换整个缓冲到字符串,而不是将每个数据块转换为字符串并将数据作为字符串累积。 (utf-8个字符可以跨越多个字节,因此您不能将字节流切换成任意片段并将每个片段分别解析为utf-8。)