基于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: ['请求失败,请重试。'] } } ] }); } };
关键注意点
- 必须等待异步操作完成:用
async/await确保API请求结束后再返回响应,不能让函数提前结束。 - 返回正确的响应格式:Dialogflow V2要求响应包含
fulfillmentMessages或fulfillmentText字段,不能只打印结果而不返回。 - 错误处理不能少:万一API请求超时、报错,也要返回一个合法的兜底响应,避免触发
MalformedResponse。
最后再检查下你的Dialogflow Fulfillment是否正确启用了Webhook,并且指向了Firebase云函数的正确URL,确保Blaze套餐的外部请求权限是正常的。
内容的提问来源于stack exchange,提问作者sumandas
相关产品推荐
相关产品推荐

