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

切换至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:53:24