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

Firebase Cloud Functions v2是否支持流?代码运行失败求助

Firebase Cloud Functions v2 流处理问题排查

Firebase Cloud Functions v2 完全支持流处理,你的代码失效是因为响应流的处理方式错误,和Nuxt的正确实现对比,核心差异如下:

关键问题分析

  • Nuxt路由中,你通过responseType: 'stream'指定$fetch返回流对象,直接返回该流后,Nuxt框架会自动完成流的转发逻辑。
  • Firebase云函数中,你直接将fetch返回的Response实例传给response.send(),这不符合Express风格响应对象的要求——你需要手动将响应流管道传输到Firebase的response对象中,而非直接发送Response实例。

修正后的Firebase云函数代码

import 'dotenv/config'
import { onRequest } from 'firebase-functions/v2/https'

export const generateTextToSpeech = onRequest(
  { cors: true },
  async (request, response) => {
    try {
      const { text } = request.body
      const xiApiKey = process.env.XI_API_KEY

      const apiResponse = await fetch(
        'https://api.elevenlabs.io/v1/text-to-speech/EXAVITQu4vr4xnSDxMaL/stream?optimize_streaming_latency=3',
        {
          method: 'POST',
          headers: {
            accept: 'audio/mpeg',
            "Content-Type": "application/json",
            "xi-api-key": xiApiKey
          },
          body: JSON.stringify({
            text: 'hello world',
            model_id: 'eleven_turbo_v2',
            voice_settings: {
              stability: 0.5,
              similarity_boost: 0.75,
              style: 0,
              use_speaker_boost: false
            }
          })
        }
      )

      // 复制外部API的响应头(保证信息准确性)
      response.setHeader('Content-Type', apiResponse.headers.get('Content-Type'))
      // 将外部API的响应流管道传输到Firebase响应对象
      apiResponse.body.pipe(response)
    } catch (error) {
      console.error('Error:', error)
      response.status(500).send('An error occurred')
    }
  }
)

补充说明

  1. fetch返回的Response对象的body属性是可读流,通过pipe()方法可直接将其内容传输到Firebase的response对象(基于Express响应实现,支持管道操作)。
  2. 优先复制外部API返回的响应头,而非手动硬编码,能避免头信息不匹配的问题。

内容的提问来源于stack exchange,提问作者redshift

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:57:46