NodeJS中的流

时间:2013-08-27 07:36:02

标签: javascript node.js unix stream

我需要一些帮助来了解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'

2 个答案:

答案 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);};