0

NodeJS でストリームがどのように機能するかを理解するのに助けが必要です

UNIXプロセスを呼び出すモジュールを作成する必要があり(を使用) 、このプロセスのを読み取り可能なストリームspawnにリダイレクトしたいと考えています。stdout

exportsこの動作をReadable Streamにしたいので、別のモジュールがそれらを読み取れるようにします。

これを行うために、私は小さなコードを書きました:

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 クラスのほとんどは、直接使用するためのものではなく、カスタム タイプのベースとして使用するためのものです。

は、Readable または Writable ストリーム クラスの場合と同様に、およびメソッドstream.Duplexの基になる実装で拡張されるように設計された抽象クラスであることに注意してください。_read(size)_write(chunk, encoding, callback)

1 つの注目すべき例外は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ために実装する必要があります。

アップデート

OK、標準出力からのデータソースがあります。write関数が必要になります。これを使用してください:

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