You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Web API ReadableStream转换为Node.js stream.Readable?

如何将Web API ReadableStream转换为Node.js stream.Readable?

嘿,我来给你唠唠怎么把Web API里的ReadableStream转换成Node.js的stream.Readable,这刚好是把Node流转成Web流的反向操作,很多场景下都用得上~

最直接的方法是手动封装一个Node流,把Web流的读取逻辑整合进去,我给你写个实用的函数示例:

const { Readable } = require('stream');

function webToNodeStream(webStream) {
  return new Readable({
    async read() {
      // 获取Web流的读取器
      const reader = webStream.getReader();
      try {
        // 异步读取数据
        const { done, value } = await reader.read();
        if (done) {
          // 读取完成,标记Node流结束
          this.push(null);
          return;
        }
        // 把读取到的数据推到Node流里
        this.push(value);
      } catch (err) {
        // 如果出错,把错误传递给Node流
        this.destroy(err);
      } finally {
        // 释放读取器的锁,避免内存泄漏
        reader.releaseLock();
      }
    }
  });
}

这个函数的逻辑很清晰:接收Web的ReadableStream作为参数,返回一个Node的Readable实例。在Node流的read方法里,我们通过Web流的读取器异步拉取数据,拿到数据后推给Node流;如果Web流读完了,就推null告诉Node流结束;要是中间出了错,就把错误传递给Node流处理,最后别忘了释放读取器的锁哦。

如果你的Web流是对象流(不是字节流),那只要在创建Node流的时候加上objectMode: true就行,修改一下函数:

const { Readable } = require('stream');

function webToNodeObjectStream(webStream) {
  return new Readable({
    objectMode: true, // 开启对象模式
    async read() {
      const reader = webStream.getReader();
      try {
        const { done, value } = await reader.read();
        if (done) {
          this.push(null);
          return;
        }
        this.push(value);
      } catch (err) {
        this.destroy(err);
      } finally {
        reader.releaseLock();
      }
    }
  });
}

这样转换后的Node流就能正确处理对象数据啦~

备注:内容来源于stack exchange,提问作者Borewit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 10:19:34