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

基于Firebase部署的Google Action触发MalformedResponse错误求助

解决Dialogflow V2 + Google Action的MalformedResponse问题

嘿,我看你遇到的问题了——用Firebase云函数做Webhook调用外部API后,碰到了MalformedResponse提示,说必须设置final_response对吧?结合你的环境(Blaze套餐、Dialogflow V2、Firebase部署)和代码,我来给你捋捋核心问题和解决办法。

问题根源

你的代码用了request这个回调式的HTTP库,但Firebase云函数是异步执行模型,如果用普通回调,函数会在API请求完成前就结束并返回空响应,这就导致Dialogflow/Google Action收不到合法的final_response,直接触发错误。

解决方案:用Promise处理异步请求

推荐用Promise-based的方式来处理API调用,确保云函数等待请求完成后再返回正确格式的响应。下面给你两种可行的写法:

写法1:用Axios(更简洁的Promise库)

先在你的云函数目录安装Axios:

npm install axios

然后修改函数代码:

const axios = require('axios');

// 替换成你的Webhook函数名
exports.googleActionWebhook = async (req, res) => {
  try {
    // 发起外部API请求
    const apiResponse = await axios.get('你的目标URL', {
      headers: {
        'User-Agent': 'request'
      }
    });

    // 解析API返回结果
    const result = apiResponse.data.element;
    console.log('Title 0 ' + result);

    // 构造符合Dialogflow V2格式的响应
    res.json({
      fulfillmentMessages: [
        {
          text: {
            text: [`成功获取结果:${result}`]
          }
        }
      ]
    });
  } catch (error) {
    console.error('API请求出错:', error);
    // 错误兜底,返回合法响应避免MalformedResponse
    res.json({
      fulfillmentMessages: [
        {
          text: {
            text: ['抱歉,暂时无法获取数据,请稍后再试。']
          }
        }
      ]
    });
  }
};

写法2:包装request为Promise(如果你不想换库)

如果坚持用request,可以把它包装成Promise来适配async/await:

const request = require('request');

// 封装request为Promise函数
const requestAsync = (options) => {
  return new Promise((resolve, reject) => {
    request(options, (error, response, body) => {
      if (error) return reject(error);
      if (response.statusCode !== 200) return reject(new Error(`请求失败,状态码:${response.statusCode}`));
      resolve(JSON.parse(body));
    });
  });
};

exports.googleActionWebhook = async (req, res) => {
  try {
    const options = {
      url: '你的目标URL',
      headers: { 'User-Agent': 'request' }
    };

    const apiData = await requestAsync(options);
    const result = apiData.element;
    console.log('Title 0 ' + result);

    // 返回合法响应
    res.json({
      fulfillmentMessages: [
        {
          text: {
            text: [`结果:${result}`]
          }
        }
      ]
    });
  } catch (error) {
    console.error('出错了:', error);
    res.json({
      fulfillmentMessages: [
        {
          text: {
            text: ['请求失败,请重试。']
          }
        }
      ]
    });
  }
};

关键注意点

  1. 必须等待异步操作完成:用async/await确保API请求结束后再返回响应,不能让函数提前结束。
  2. 返回正确的响应格式:Dialogflow V2要求响应包含fulfillmentMessages或fulfillmentText字段,不能只打印结果而不返回。
  3. 错误处理不能少:万一API请求超时、报错,也要返回一个合法的兜底响应,避免触发MalformedResponse。

最后再检查下你的Dialogflow Fulfillment是否正确启用了Webhook,并且指向了Firebase云函数的正确URL,确保Blaze套餐的外部请求权限是正常的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:53:55