我需要一些帮助来了解NodeJS中的流工作方式
我解释一下,我需要编写一个调用UNIX进程的模块(使用spawn
),我想将此进程的stdout
重定向到可读流。
我希望将此行为发送到exports
可读流,并允许其他模块读取它们。
为此,我写了一小段代码:
var spawn = require('child_process').spawn
var Duplex = require('stream').Duplex;
var stream = new Duplex;
var start = function() {
ps = spawn('mycmd', [/*... args ...*/]);
ps.stdout.pipe(stream);
};
exports.stream = stream;
exports.start = start;
但是如果我使用这个模块,我会抛出一个异常,说该流没有实现_read方法。
你能帮我解决这个问题吗?
提前致谢。
[编辑]我已经尝试了创建Stream对象的解决方案,但这不起作用,这里是代码:
var spawn = require('child_process').spawn;
var Stream = require('stream');
var ps = null;
var audio = new Stream;
audio.readable = audio.writable = true;
var start = function() {
if(ps == null) {
ps = spawn('mycmd', []);
ps.stdout.pipe(stream);
}
};
var stop = function() {
if(ps) {
ps.kill();
ps = null;
}
};
exports.stream = stream;
exports.start = start;
exports.stop = stop;
但是当我尝试收听流时,我会输入一个新错误:
_stream_readable.js:583
var written = dest.write(chunk);
^
TypeError: Object #<Stream> has no method 'write'
答案 0 :(得分:2)
大多数Node的Stream classes并不是直接使用,而是作为自定义类型的基础:
请注意,
stream.Duplex
是一个抽象类,旨在使用_read(size)
和_write(chunk, encoding, callback)
方法的基础实现进行扩展,就像使用可读或可写流类一样。
一个值得注意的例外是stream.PassThrough
,这是一个简单的回声流实现。
var PassThrough = require('stream').PassThrough;
var stream = new PassThrough;
另请注意ps
will be a global,使其可以在所有其他模块中直接访问。
答案 1 :(得分:0)
如果你只是想使用流,那么你应该这样做:
var stream = new Stream;
stream.readable = stream.writable = true;
Duplex适用于开发人员。需要为_read
和_write
等方法实施一些方法。
[<强>更新强>
好的,你有来自stdout的数据源。您将需要write
功能,请使用此功能:
stream.write = function(data){this.emit('data', data);};