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是不能插入到集合中的节点缓冲区;首先将其转换为字符串。

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

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

于 2013-01-21T15:49:23.737 回答