Dialogflow Fulfillment报错Request can NOT be empty但请求非空求助
你遇到的"Request can NOT be empty"报错并非因为req.body为空,而是代码中存在几个关键问题导致Webhook响应异常,被Dialogflow误判。结合你的请求日志和代码,核心问题及修复方案如下:
核心问题分析
未定义的变量触发运行时异常
代码中使用了SELECTION_KEY_ONE、IMG_URL_AOG等常量但未声明,运行时会抛出ReferenceError,导致Webhook无法生成有效响应。平台组件不兼容
你使用了Actions on Google的Carousel组件,但请求来自Dialogflow Messenger(从session字段dfMessenger-73173927可判断),该组件仅适用于Google Assistant平台,无法在Dialogflow Messenger中正常渲染,同时会导致响应格式错误。WebhookClient使用方式错误
同时调用agent.add(conv)和agent.send(conv)属于冗余操作,且非Google Assistant平台下使用conv对象会导致响应结构不符合Dialogflow要求。
修复方案
步骤1:补全未定义的常量
先声明所有用到的常量,避免运行时错误:
const SELECTION_KEY_ONE = 'menu_item_1'; const SELECTION_KEY_GOOGLE_HOME = 'menu_item_2'; const SELECTION_KEY_GOOGLE_PIXEL = 'menu_item_3'; const SELECTION_KEY_GOOGLE_ALLO = 'menu_item_4'; const IMG_URL_AOG = 'https://your-domain.com/image1.png'; const IMG_URL_GOOGLE_HOME = 'https://your-domain.com/image2.png'; const IMG_URL_GOOGLE_PIXEL = 'https://your-domain.com/image3.png'; const IMG_URL_GOOGLE_ALLO = 'https://your-domain.com/image4.png';
步骤2:使用Dialogflow Messenger兼容的Payload实现Carousel
替换Actions on Google的Carousel组件,改用Dialogflow支持的richContent格式Payload:
const { Pedido, buscaPedidos } = require('../models/PedidosModel'); const { WebhookClient, Payload } = require('dialogflow-fulfillment'); // 补全常量定义 const SELECTION_KEY_ONE = 'menu_item_1'; const SELECTION_KEY_GOOGLE_HOME = 'menu_item_2'; const SELECTION_KEY_GOOGLE_PIXEL = 'menu_item_3'; const SELECTION_KEY_GOOGLE_ALLO = 'menu_item_4'; const IMG_URL_AOG = 'https://your-domain.com/image1.png'; const IMG_URL_GOOGLE_HOME = 'https://your-domain.com/image2.png'; const IMG_URL_GOOGLE_PIXEL = 'https://your-domain.com/image3.png'; const IMG_URL_GOOGLE_ALLO = 'https://your-domain.com/image4.png'; exports.bot = async (req, res) => { console.log(req.body); const agent = new WebhookClient({ req, res }); // 创建Dialogflow Messenger兼容的Carousel Payload const carouselPayload = new Payload(agent.UNSPECIFIED, { richContent: [ [ { "type": "carousel", "items": [ { "title": "Title of First Carousel Item", "description": "This is a description of a carousel item.", "image": { "src": IMG_URL_AOG, "alt": "Image alternate text" }, "button": { "text": "Selecionar", "postback": SELECTION_KEY_ONE } }, { "title": "Google Home", "description": "Google Home is a voice-activated speaker powered by the Google Assistant.", "image": { "src": IMG_URL_GOOGLE_HOME, "alt": "Google Home" }, "button": { "text": "Selecionar", "postback": SELECTION_KEY_GOOGLE_HOME } }, { "title": "Google Pixel", "description": "Pixel. Phone by Google.", "image": { "src": IMG_URL_GOOGLE_PIXEL, "alt": "Google Pixel" }, "button": { "text": "Selecionar", "postback": SELECTION_KEY_GOOGLE_PIXEL } }, { "title": "Google Allo", "description": "Introducing Google Allo, a smart messaging app that helps you say more and do more.", "image": { "src": IMG_URL_GOOGLE_ALLO, "alt": "Google Allo Logo" }, "button": { "text": "Selecionar", "postback": SELECTION_KEY_GOOGLE_ALLO } } ] } ] ] }, { sendAsMessage: true }); agent.add(carouselPayload); };
步骤3:验证Webhook响应
修复后,Webhook会返回符合Dialogflow要求的响应结构,避免因格式错误导致的"Request can NOT be empty"误报。
内容的提问来源于stack exchange,提问作者Mariana Arruda

