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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:45:31