Node.js使用Streams API加密Azure Blob时报ReadableStream未定义错误
问题解决办法
报错原因
ReadableStream is not defined 报错是因为 Node.js 16及更早版本没有全局暴露WHATWG标准的ReadableStream接口,你参考的教程大概率是浏览器端代码或者高版本Node环境的示例,和你当前运行环境不匹配。
而且你现有代码已经把Blob内容全量读取成了字符串,完全不需要额外构造ReadableStream,属于冗余逻辑,直接删除这段代码就能解决问题。
最简修复方案
删除构造ReadableStream的冗余代码,直接把已经读取到的blobData传给openpgp即可,修改后对应代码段如下:
// 原有读取逻辑不变 let blobData = await streamToString(downloadBlockBlobResponse.readableStreamBody) // 删除原来构造ReadableStream的代码,直接传字符串 const encrypted = await openpgp.encrypt({ message: await openpgp.createMessage({ text: blobData }), // 直接传入读取到的字符串 publicKeys: publicKey, privateKeys: privateKey });
大文件优化方案(可选,避免全量加载内存)
如果你要加密的Blob体积较大,全量读入内存会占用过高资源,可改用流处理方式,操作如下:
- 升级Node.js版本到18.x及以上,18开始默认全局支持WHATWG ReadableStream,或者在代码顶部手动导入:
// Node 16/17 使用该导入需要开启--experimental-webstreams启动flag const { ReadableStream } = require('stream/web');
- 调整代码逻辑,不把Blob全量转成字符串,直接流转流加密上传即可,节省内存。
额外注意点
你代码中await containerEncryptedFiles.createIfNotExists("encrypted-dide") 属于参数错误,createIfNotExists方法不需要传入容器名称,你调用getContainerClient的时候已经指定了容器名,多余参数会被识别为公共访问层级配置,建议删除参数改为await containerEncryptedFiles.createIfNotExists()。
内容的提问来源于stack exchange,提问作者A B
相关产品推荐
相关产品推荐

