Dialogflow then回调内setFollowupEvent不生效问题求解
问题成因
核心原因是异步Promise未返回给Dialogflow fulfillment运行时,属于内联编辑器写异步逻辑的典型坑:
- Dialogflow内联编辑器的运行环境是Cloud Functions,fulfillment逻辑默认同步代码跑完就立刻组装响应回传给对话引擎,不会主动等待未被绑定的异步操作执行完。
- 你代码里的
axios.post是异步请求,没有把这个请求返回的Promise对象return给处理函数,Dialogflow执行完agent.add("hello")就直接把响应发回去了。后面then回调里的setFollowupEvent执行的时候,响应早就发完了,这时候再修改agent对象的内容,根本不会被写到最终返回给Dialogflow的响应包里,当然触发不了后续事件。 - 你硬编码事件名也失效就是这个原因,和传的参数值没有关系,只要
setFollowupEvent写在没被等待的异步回调里,写什么内容都没用。控制台能看到then块的日志,只是因为Cloud Functions不会在同步代码跑完后立刻终止进程,异步请求还是会跑完打日志,但这时候对话流程早就走完了。 - 你之前排查的context配置和当前问题无关,现在流程根本没走到事件匹配意图的步骤,followup事件从根上就没设置成功。
解决方法
- 把axios请求返回的Promise显式return给处理函数,让Dialogflow运行时知道要等这个异步操作跑完,再组装最终响应。
- 补充异常捕获逻辑,避免API请求报错时直接抛出函数运行错误,中断对话。
修正后的可运行代码如下:
function setFollow(agent) { agent.add("hello"); // 核心改动:return axios生成的Promise,让运行时等待异步执行完成 return axios.post(url, body, {headers}) .then (({ data }) => { agent.add("setting followup event"); agent.setFollowupEvent({ "name": data.followupEventInput_name, "parameters" : { "name": data.name} }); }) .catch(err => { console.error("对接API请求失败", err); agent.add("当前处理出现异常,请稍后重试"); }) }
- 代码修改完成后重新部署内联编辑器的函数即可生效,不需要调整现有context配置,只要事件触发时context A处于活跃状态,就能正常匹配到目标意图。
内容的提问来源于stack exchange,提问作者Exter
相关产品推荐
相关产品推荐

