Firebase云函数视频文件下载失败问题求助
Firebase云函数下载视频资产失败排查与修复
问题概述
自2024年1月26日起,Firebase云函数下载视频资产时失败,此前稳定运行一年且无代码变更。使用Firebase Admin 12.0.0 + Node 20,代码中通过流下载能收到data缓冲区日志,但error/end监听器未触发,调用bucket.file(filePath).download()同样无效。
核心问题排查与修复
1. Promise调用错误(代码致命问题)
你的downloadFile函数中,Promise的resolve和reject仅返回了函数引用,未实际调用,导致Promise永远无法完成,函数会因超时而静默失败。
错误代码片段:
stream.on('error', (err) => { console.log('🚀 ~ PromptService ~ err ~ err:', err); return reject; // 未调用reject(err) }); stream.on('end', (data: any) => { console.log('🚀 ~ PromptService ~ err ~ err:', data); return resolve; // 未调用resolve() });
修正后代码:
const downloadFile = () => { return new Promise((resolve, reject) => { const readStream = bucket.file(filePath).createReadStream(); const writeStream = fs.createWriteStream(downloadFilePath); readStream.on('data', (data) => { console.log('接收数据块:', data.length); }); readStream.on('error', (err) => { console.error('读取流错误:', err); reject(err); // 调用reject并传入错误信息 }); readStream.on('end', () => { console.log('读取流结束'); resolve(); // 调用resolve完成Promise }); // 监听写入流错误,避免写入失败无反馈 writeStream.on('error', (err) => { console.error('写入流错误:', err); reject(err); }); writeStream.on('finish', () => { console.log('文件写入完成'); }); readStream.pipe(writeStream); functions.logger.log(`开始下载 gs://${bucket.name}/${fileName} 到 ${downloadFilePath}`); }); };
2. 云函数资源限制
视频文件过大时,云函数默认配置(256MB内存、90秒超时)可能不足以完成下载:
- 调整云函数内存至512MB或更高
- 延长超时时间至最大9分钟(需在Firebase控制台或
firebase.json中配置)
3. 存储权限与服务端变更
- 检查云函数使用的服务账号权限,确认是否有
storage.objects.get权限(避免控制台权限被误改) - 排查Firebase Storage服务端是否有变更(2024年初部分区域可能有底层更新,可查看Firebase状态页确认)
4. Node.js 20兼容性验证
Firebase Admin 12.0.0官方支持Node.js 20,但需确认依赖包是否存在兼容性问题:
- 执行
npm audit检查依赖漏洞 - 尝试临时降级至Node.js 18测试,确认是否为Node版本导致的流处理问题
验证步骤
- 修复Promise调用错误后重新部署函数
- 增大云函数内存与超时时间
- 下载小体积视频测试,确认基础功能正常
- 逐步测试大体积视频,观察是否仍有异常
内容的提问来源于stack exchange,提问作者Eric Van Dyn Hoven
相关产品推荐
相关产品推荐

