在任何平台上的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
答案 0 :(得分:1)
data
是一个节点Buffer,无法插入集合中;首先将它转换为字符串。
另请注意,当数据从子进程流式传输时,将多次调用您的数据事件回调(除非输出太小,以至于您碰巧在一个缓冲区中获取了所有内容)。您需要在缓冲区中累积数据,然后在获得流结束事件时将其插入到集合中。
如果你的子进程有可能输出utf-8(纯ASCII以外的任何东西),请确保首先在节点Buffer中累积数据,然后然后转换整个缓冲到字符串,而不是将每个数据块转换为字符串并将数据作为字符串累积。 (utf-8个字符可以跨越多个字节,因此您不能将字节流切换成任意片段并将每个片段分别解析为utf-8。)