使用Actions-on-Google NodeJS库与Dialogflow Fulfillment遇响应格式错误求助
解决Actions-on-Google中MalformedResponse错误的两种场景
我之前在使用Actions-on-Google NodeJS库搭配dialogflow-fulfillment时,也碰到过一模一样的问题!其实核心是对conv.close()的用法理解有偏差,让我帮你拆解问题和解决办法:
情况1:未使用conv.close()时报错MalformedResponse 'final_response' must be set
这个报错的逻辑很清晰:Actions on Google平台要求,当你要结束对话时,必须明确标记这是最终响应。如果你只调用了conv.ask()添加内容,却没有告诉平台“这是最后一轮回复”,平台会认为你的响应不完整,就会抛出这个错误。
情况2:使用conv.close()搭配Suggestions时报错
你这里的问题是把Suggestions实例直接传给了conv.close(),但conv.close()的正确用法不是这样的:
conv.close()的作用是标记当前响应为最终响应,它可以接受内容参数,但参数需要是完整的响应内容(比如文本数组或结构化响应对象);- 更常用的方式是先通过
conv.ask()添加所有需要的内容(文本、富媒体元素都可以),再调用无参数的conv.close()来结束对话。
正确代码示例
下面两种写法都可以解决你的问题:
写法1:先添加所有内容,再标记结束
let conv = agent.conv(); // 添加文本内容 conv.ask('Sample Title'); conv.ask('Sample Next Line'); // 添加建议芯片 conv.ask(new Suggestions('Lets Go!!', 'Awesome!!')); // 标记对话为最终响应 conv.close(); agent.add(conv);
写法2:直接把所有内容传给conv.close()
let conv = agent.conv(); // 一次性传入所有响应内容,同时标记结束 conv.close([ 'Sample Title', 'Sample Next Line', new Suggestions('Lets Go!!', 'Awesome!!') ]); agent.add(conv);
关键注意点
- 如果你需要结束对话,必须调用
conv.close(),否则会触发情况1的报错; - 富媒体元素(比如
Suggestions)需要通过conv.ask()添加,或者作为数组项传给conv.close(),不能直接作为conv.close()的唯一参数; - 确保你的响应结构符合Actions on Google的规范,dialogflow-fulfillment库会帮你转换格式,但前提是你调用API的方式正确。
内容的提问来源于stack exchange,提问作者Tarun
相关产品推荐
相关产品推荐

