如何testing对象是否是NodeJS中的Stream
我有一个函数接收一个对象,可能是一个string
, Buffer
或Stream
。
我可以很容易地testing,如果对象是一个缓冲区如此: if (x instanceof Buffer)
testing一个对象是一个Stream的最好方法是什么? 在节点中似乎没有Stream基类 – 在那里?
我该找什么?
您正在寻找的原型是stream.Readable
stream可读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.Readable
和stream.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