Streaming di NodeJS

Saya memerlukan bantuan untuk memahami cara kerja streaming di NodeJS

Saya jelaskan, saya perlu menulis modul yang memanggil proses UNIX (dengan spawn) dan saya ingin mengarahkan stdout dari proses ini ke Aliran yang Dapat Dibaca.

Saya ingin perilaku ini exports Aliran yang Dapat Dibaca dan mengizinkan modul lain untuk membacanya.

Untuk melakukan ini, saya telah menulis sedikit kode:

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;

Tetapi jika saya menggunakan modul ini, saya memberikan pengecualian yang mengatakan bahwa aliran tidak mengimplementasikan metode _read.

Bisakah Anda membantu saya mengatasi masalah ini?

Terima kasih sebelumnya.

[EDIT] Saya telah mencoba solusi membuat objek Stream, tetapi tidak berhasil, berikut kodenya:

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;

Tetapi ketika saya mencoba mendengarkan streaming, saya menemukan kesalahan baru:

_stream_readable.js:583
    var written = dest.write(chunk);
                       ^
TypeError: Object #<Stream> has no method 'write'

person Vincent Saluzzo    schedule 27.08.2013    source sumber
comment
Apakah Anda ingin menggunakan stream atau ingin menerapkan stream ?   -  person user568109    schedule 27.08.2013
comment
Saya ingin menggunakan aliran yang Dapat Dibaca untuk pengguna yang menggunakan modul saya, dan saya ingin mengisi aliran ini dengan data yang disediakan oleh stdout dari proses yang saya buat   -  person Vincent Saluzzo    schedule 27.08.2013


Jawaban (2)


Sebagian besar kelas aliran Node tidak dimaksudkan untuk digunakan secara langsung, namun sebagai basis dari tipe khusus:

Perhatikan bahwa stream.Duplex adalah kelas abstrak yang dirancang untuk diperluas dengan implementasi dasar metode _read(size) dan _write(chunk, encoding, callback) seperti yang Anda lakukan dengan kelas aliran yang Dapat Dibaca atau Ditulis.

Satu pengecualian penting adalah stream.PassThrough, yang merupakan implementasi aliran gema sederhana.

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

Perhatikan juga bahwa ps akan bersifat global , membuatnya dapat diakses langsung di semua modul lainnya.

person Jonathan Lonowski    schedule 27.08.2013
comment
Besar ! Itu dia pekerjaan! - person Vincent Saluzzo; 28.08.2013

Jika Anda hanya ingin menggunakan streaming maka Anda harus melakukan:

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

Dupleks ditujukan untuk pengembang. Beberapa metode seperti _read dan _write perlu diterapkan untuk itu.

[Pembaruan]

Oke, Anda memiliki sumber data, dari stdout. Anda memerlukan fungsi write, gunakan ini:

stream.write = function(data){this.emit('data', data);};
person user568109    schedule 27.08.2013
comment
Oke, jadi aku punya pembantu yang kebingungan? Saya mencoba menggunakan Stream sebagai penyedia streaming tetapi kenyataannya, meskipun saya memasukkan data ke Stream, perilaku yang saya inginkan bukan untuk penyedia Stream? - person Vincent Saluzzo; 27.08.2013
comment
Sebagai penyedia Aliran, Anda akan menggunakan ReadableStream untuk membaca dari sumber yang mendasarinya, misalnya. file di disk. Anda harus mengimplementasikan pembukaan file, membaca, mendorong, dll. Yang Anda inginkan adalah aliran di perpustakaan Anda, menurut saya, sehingga orang lain dapat membacanya. Jika Anda menginginkannya untuk perpipaan, Anda tidak perlu menerapkan aliran. - person user568109; 27.08.2013
comment
Oke, jadi saya sudah mencoba solusi Anda tetapi ketika saya mencoba membaca dari aliran saya memberikan pengecualian: _stream_readable.js:583 var write = dest.write(chunk); ^ TypeError: Objek #‹Stream› tidak memiliki metode 'tulis' - person Vincent Saluzzo; 28.08.2013