如何测试对象是否是NodeJS中的Stream

Mik*_*uso 21 node.js

我有接收的对象可以是一个函数string,BufferStream.

我可以很容易地测试对象是否像这样的缓冲区: if (x instanceof Buffer)

测试对象是否为Stream的最佳方法是什么?节点中似乎没有Stream基类 - 是吗?

我应该寻找什么?

Ger*_*sio 12

对于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
Run Code Online (Sandbox Code Playgroud)


Séb*_*uld 8

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


Wal*_*ter 7

并非所有流都使用stream.Readable和实现stream.Writable

process.stdout instanceof require("stream").Writable; // false
process.stdout instanceof require("readable-stream").Writable; // false
Run Code Online (Sandbox Code Playgroud)

更好的方法是单独检查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'
}
Run Code Online (Sandbox Code Playgroud)

您可以随时参考:https : //github.com/DefinitelyTyped/DefinitelyTyped/blob/master/node/node.d.ts#L252