Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS中的流_Javascript_Node.js_Unix_Stream - Fatal编程技术网

Javascript NodeJS中的流

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

我需要一些帮助来理解流在NodeJS中是如何工作的

我解释说,我需要编写一个模块来调用UNIX进程(使用
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”方法太好了!这就是工作!