切换至Bun后GCS无法下载70KB以上文件的问题求助
GCS .download() 在Bun环境下无法下载大于70KB文件的问题解决
问题重现
原Express环境中使用GCS SDK的download()方法下载文件一切正常,但切换到Bun后,下载大于70KB的文件会直接终止,无法执行到download()之后的代码,同时抛出两个错误:
MetadataLookupWarning:提示Was there a typo in the URL or port? code = FailedToOpenSocket,来自gcp-metadata库- 类型错误:
TypeError: undefined is not an object (evaluating 'state.buffer[0].length'),来自stream-shift和duplexify依赖
可行的解决方法
1. 替换download()为流式读取或直接HTTP请求
Bun的stream实现与Node.js存在差异,绕开SDK的download()方法能避免兼容问题:
用createReadStream()流式读取文件
const stream = findFile.createReadStream(); const chunks = []; for await (const chunk of stream) { chunks.push(chunk); } const fileBuffer = Buffer.concat(chunks); // 后续将fileBuffer作为邮件附件处理
通过公共URL用Bun.fetch下载
如果文件是公共可读的,直接用Bun原生fetch获取:
const publicFileUrl = '你的GCS文件公共URL'; const res = await fetch(publicFileUrl); const arrayBuffer = await res.arrayBuffer(); const fileBuffer = Buffer.from(arrayBuffer); // 用于邮件附件
2. 禁用GCS SDK的元数据自动检测
报错中的元数据查找警告,是因为Bun环境下SDK无法正常获取GCP元数据导致的,初始化Storage时可以强制指定端点并禁用元数据重试:
const { Storage } = require('@google-cloud/storage'); const storage = new Storage({ apiEndpoint: 'https://storage.googleapis.com', metadataRetry: false, autoRetry: false });
3. 引入@bun/node增强Node.js兼容
安装@bun/node来提供更贴近Node.js的stream和网络API支持:
bun add @bun/node
在代码顶部引入:
import '@bun/node';
4. 升级Bun到最新版本
Bun处于快速迭代阶段,旧版本可能存在stream或网络请求的bug,执行升级命令:
bun upgrade
内容的提问来源于stack exchange,提问作者Pato P
相关产品推荐
相关产品推荐

