Node.js 18+Firebase SDK v9下Storage上传无响应问题求助
问题解决:Node.js 18 + Firebase SDK v9 客户端Storage上传无响应
核心问题
内部CLI脚本使用Firebase客户端SDK(非Admin SDK),在Node.js 12+Firebase SDK v7环境下运行正常,升级至Node.js 18+Firebase SDK v9后,Storage的uploadBytes()/uploadBytesResumable()功能完全卡住,无任何回调或请求记录,但下载功能可正常运行。
可能原因及解决方案
1. Node.js 18默认HTTP/2协议兼容性问题
Node.js 18开始默认启用HTTP/2,但Firebase Storage客户端SDK在部分场景下与HTTP/2存在兼容性问题,导致请求无法正常发送。
解决方法:强制Firebase Storage使用HTTP/1.1,通过自定义fetch配置实现:
- 先安装适配Node.js环境的
node-fetch@2:npm install node-fetch@2 - 修改Storage初始化代码,添加自定义fetch配置:
import fs from 'node:fs'; import { initializeApp } from 'firebase/app'; import { getAuth, signInWithEmailAndPassword, signOut } from 'firebase/auth'; import { getStorage, ref, uploadBytesResumable } from 'firebase/storage'; import fetch from 'node-fetch'; import http from 'http'; import https from 'https'; const firebaseConfig = (await import('./config.mjs')).default; const userCredentials = JSON.parse(fs.readFileSync('./credentials.json').toString()); const app = initializeApp(firebaseConfig); // 配置Storage强制使用HTTP/1.1 const storage = getStorage(app, { fetch: (url, options) => { const agent = url.protocol === 'http:' ? new http.Agent({ keepAlive: true }) : new https.Agent({ keepAlive: true, rejectUnauthorized: true }); return fetch(url, { ...options, agent }); } }); (async () => { const auth = getAuth(app); let { user } = await signInWithEmailAndPassword(auth, userCredentials.email, userCredentials.password); let storageRef = ref(storage, `users/${user.uid}/test.jpg`); const buffer = fs.readFileSync('./test.jpg'); // 将Buffer转为Blob,解决部分类型兼容问题 const blob = new Blob([buffer], { type: 'image/jpeg' }); const uploadTask = uploadBytesResumable(storageRef, blob); uploadTask.on('state_changed', (snapshot) => console.log('进度:', snapshot.bytesTransferred, '/', snapshot.totalBytes), (err) => console.error('上传错误:', err), () => console.log('上传完成') ); await uploadTask; console.log('上传流程执行完成'); await signOut(auth); console.log('操作结束'); })();
2. SDK版本bug
firebase@9.9.4存在已知的Node.js 18兼容性问题,升级至最新9.x稳定版可修复:
npm install firebase@latest
3. 流类型兼容问题
Node.js原生ReadStream在Firebase SDK v9下可能存在处理异常,优先使用Buffer转换为Blob的方式上传,避免直接传递ReadStream。
验证要点
- 修改后查看Firebase控制台的规则监控,确认请求已正常发出
- 检查上传回调是否正常触发进度、完成或错误事件
内容的提问来源于stack exchange,提问作者matth
相关产品推荐
相关产品推荐

