2013-06-09 17 views
21

Ho una funzione che riceve un oggetto che potrebbe essere un string, Buffer o Stream.Come verificare se un oggetto è uno streaming in NodeJS

mi può facilmente verificare se l'oggetto è un buffer in questo modo: if (x instanceof Buffer)

Qual è il modo migliore per verificare se un oggetto è un flusso? Non sembra che ci sia una classe di base Stream nel nodo: c'è?

Cosa dovrei cercare?

risposta

6

Il prototipo che si desidera è il flusso stream.Readable per flussi leggibili e stream.Writable per flussi scrivibili. Funzionano allo stesso modo di quando controlli lo Buffer.

+0

dovrebbe essere questo minuscolo stream.readable? non sembra avere la proprietà con maiuscolo –

11

Per Readable si può fare:

var stream = require('stream'); 

function isReadableStream(obj) { 
    return obj instanceof stream.Stream && 
    typeof (obj._read === 'function') && 
    typeof (obj._readableState === 'object'); 
} 

console.log(isReadableStream(fs.createReadStream('car.jpg'))); // true 
console.log(isReadableStream({}))); // false 
console.log(isReadableStream(''))); // false 
+0

thx per dare codice riproducibile, usato in https://github.com/loveencounterflow/hollerith test – flow

4

non sono implementati tutti i flussi utilizzando stream.Readable e stream.Writable.

process.stdout instanceof require("stream").Writable; // false 
process.stdout instanceof require("readable-stream").Writable; // false 

Il metodo migliore è verificare individualmente le funzioni read(), write(), end().

var EventEmitter = require("events"); 

function isReadableStream(test) { 
    return test instanceof EventEmitter && typeof test.read === 'function' 
} 

function isWritableStream(test) { 
    return test instanceof EventEmitter && typeof test.write === 'function' && typeof test.end ==== 'function' 
} 

Si può sempre reffer a: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/node/node.d.ts#L252

+0

è sicuro assumere questo codice ('process.stdout instanceof require ("stream"). Writable; ') è il modo migliore per supporre che uno stream sia un' process.stdout'? – hisabimbola

+0

@hisabimbola Non utilizzare semplicemente 'instanceof require (" events "). EventEmitter' e controllare le proprietà' write' e 'end'. Qualcos'altro fallirà in un punto o nell'altro. – Walter

+0

Quello che sto cercando di fare è testare che un flusso scrivibile è esattamente 'process.stdout' non testare se è un flusso scrivibile. Maggiori informazioni su questo [qui] (http://stackoverflow.com/q/41521709/4151025) – hisabimbola

Problemi correlati