Nodejs: проверить, является ли переменная читаемым потоком

Как я могу проверить, является ли var читаемым потоком в Nodejs?

Пример:

function foo(streamobj){

   if(streamobj != readablestream){
       // Error: no writable stream
   }else{
      // So something with streamobj 
   }
}

Я пробовал

if (!(streamobj instanceof stream.Readable)){

Но чем я получаю ReferenceError: поток не определен

Ответ 1

Ваша проблема, безусловно, в том, что вам не требуется stream. Но. instanceof не является хорошим методом проверки, является ли переменная читаемым потоком. Рассмотрим следующие случаи:

  • объект может быть потоком старого стиля (экземпляр stream.Stream);
  • объект может быть только эмиттером с событиями data и end;
  • объект может быть экземпляром Readable из внешнего модуля (https://github.com/isaacs/readable-stream);

Самый лучший способ - утиная печать. В принципе, если вы собираетесь в поток pipe, проверьте, имеет ли он метод pipe, если вы собираетесь прослушивать события, проверьте, есть ли метод on и т.д.

Ответ 2

Кажется, что вы забыли потребовать модуль ядра потока.

var stream = require('stream');

// somewhere in the file
if (!(streamobj instanceof stream.Readable)) {
    // Your logic
}

Ответ 3

Используйте is-stream для этого:

var isStream = require('is-stream');
if (isStream.readable(myStream)) {
  do();
}

Ответ 4

Убедитесь, что вы сделали:

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