【问题标题】:How to test if an object is a Stream in NodeJS如何在 NodeJS 中测试对象是否为 Stream
【发布时间】:2020-10-21 04:38:00
【问题描述】:

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

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

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

我应该寻找什么?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    对于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
    

    【讨论】:

    【解决方案2】:

    并非所有流都使用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

    【讨论】:

    • 是否可以安全地假设此代码 (process.stdout instanceof require("stream").Writable;) 是假设流是 process.stdout 的最佳方式?
    • @hisabimbola 不只是使用instanceof require("events").EventEmitter 并检查writeend 属性。其他任何事情都会在某一时刻失败。
    • 我想要做的是测试一个可写流是否完全是process.stdout,而不是测试它是否是一个可写流。有关此here 的更多信息
    • @hisabimbola 您必须手动检查流是否是终端 (instanceof require("tty").WriteStream === true)。然后检查它的句柄以确保它是stdinstdout (test._handle.fd < 0)。
    • 根据文档here,这个(node -p -e "Boolean(process.stdout.isTTY)" | cat)输出false,因为它不是TTY,虽然它是process.stdout
    【解决方案3】:

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

    【讨论】:

    • 这应该是小写的stream.readable吗?它似乎没有大写的属性
    • 感谢 Sebastien,下次请添加一些代码。我是菜鸟,无法解析如何将这个答案与下一个答案进行比较。
    猜你喜欢
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2012-11-05
    • 2011-02-24
    • 2016-07-27
    • 2019-07-27
    相关资源
    最近更新 更多