如何将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
相关产品推荐
相关产品推荐

