0

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

2 回答 2

2

大多数 Node 的Stream 类并不打算直接使用,而是作为自定义类型的基础:

请注意,这是一个抽象类,旨在使用和方法stream.Duplex的底层实现进行扩展,就像使用 Readable 或 Writable 流类一样。_read(size)_write(chunk, encoding, callback)

一个值得注意的例外是stream.PassThrough,它是一个简单的回显流实现。

var PassThrough = require('stream').PassThrough;
var stream = new PassThrough;

另请注意,这ps将是一个全局的,使其可以在所有其他模块中直接访问。

于 2013-08-27T08:24:32.590 回答
0

如果您只是想使用流,那么您应该这样做:

var stream = new Stream;
stream.readable = stream.writable = true;

Duplex 是为开发人员设计的。有些方法喜欢_read并且_write需要为它实现。

[更新]

好的,你有来自标准输出的数据源。你将需要write功能,使用这个:

stream.write = function(data){this.emit('data', data);};
于 2013-08-27T08:31:29.267 回答