如何testing对象是否是NodeJS中的Stream

我有一个函数接收一个对象,可能是一个stringBufferStream

我可以很容易地testing,如果对象是一个缓冲区如此: if (x instanceof Buffer)

testing一个对象是一个Stream的最好方法是什么? 在节点中似乎没有Stream基类 – 在那里?

我该找什么?

您正在寻找的原型是stream.Readablestream可读stream, stream.Writable可写stream。 它们的工作方式与检查Buffer时相同。

对于Readable你可以这样做:

 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 

并非所有的stream都使用stream.Readablestream.Writable来实现。

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

更好的方法是单独检查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' } 

你总是可以重申: https : //github.com/DefinitelyTyped/DefinitelyTyped/blob/master/node/node.d.ts#L252