Javascript NodeJS中的流
我需要一些帮助来理解流在NodeJS中是如何工作的 我解释说,我需要编写一个模块来调用UNIX进程(使用Javascript NodeJS中的流,javascript,node.js,unix,stream,Javascript,Node.js,Unix,Stream,我需要一些帮助来理解流在NodeJS中是如何工作的 我解释说,我需要编写一个模块来调用UNIX进程(使用spawn),我想将这个进程的stdout重定向到一个可读的流 我希望此行为导出可读流,并允许另一个模块读取它们 为此,我编写了一段代码: var spawn = require('child_process').spawn var Duplex = require('stream').Duplex; var stream = new Duplex; var start = functio
spawn
),我想将这个进程的stdout
重定向到一个可读的流
我希望此行为导出可读流,并允许另一个模块读取它们
为此,我编写了一段代码:
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方法
你能帮我解决这个问题吗
提前谢谢
[EDIT]我尝试了创建流对象的解决方案,但这不起作用,下面是代码:
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'
\u stream\u readable.js:583
var write=dest.write(块);
^
TypeError:对象#没有“写入”方法
大多数节点不打算直接使用,而是作为自定义类型的基础:
请注意,stream.Duplex
是一个抽象类,设计用于扩展\u read(size)
和\u write(chunk、encoding、callback)
方法的底层实现,就像您使用可读或可写流类一样
一个值得注意的例外是,它是一个简单的回显流实现
var PassThrough = require('stream').PassThrough;
var stream = new PassThrough;
还要注意的是,使其在所有其他模块中都可以直接访问。如果您只是想使用stream,那么您应该执行以下操作:
var stream = new Stream;
stream.readable = stream.writable = true;
双工是为开发人员设计的。需要为它实现一些方法,如\u read
和\u write
[更新]
好的,您有数据源,来自标准输出。您将需要write
功能,请使用此功能:
stream.write = function(data){this.emit('data', data);};
您想使用流还是要实现流?我想为使用我的模块的用户指定一个可读的流,并且我想用生成的processOk的stdout提供的数据填充这个流,所以我有点困惑?我尝试将Stream用作流提供程序,但事实上,即使我将数据推送到流中,我想要的行为也不适用于流提供程序?作为流提供程序,您将使用ReadableStream从底层源(例如磁盘上的文件)进行读取。您必须实现文件打开、读取、推送等。我认为,您需要的是库中的流,以便其他人可以从中读取。如果您希望它用于管道,您不需要实现流。好的,我已经尝试了您的解决方案,但是当我尝试从流中读取时,我抛出了一个异常:_stream_readable.js:583 var write=dest.write(chunk);^TypeError:Object#没有“write”方法太好了!这就是工作!