在Dialogflow中,我将免费版本(V2)与Firebase的出色计划配合使用。 我有一个意图适用于“测试”一词。当我在模拟器中输入“测试”时,聊天机器人会给出无响应并退出聊天。假设要调用我的API并检索信息。
奇怪的是,有一个console.log可以打印出正文并从API返回JSON。因此,这意味着该API调用可以正常运行,但该漫游器内部仍存在错误。
我发现了这个问题:Dialogflow v2 error “MalformedResponse 'final_response' must be set”
看起来很像我的问题,但我似乎无法弄清楚为使我的工作而应该做出的改变。
提前感谢您的时间。
成就:
function testcommand(agent) {
callNPApi().then((output) => {
agent.add(output);
}).catch(() => {
agent.add("That went wrong!");
});
}
function callNPApi() {
return new Promise((resolve, reject) => {
request2(url, function (error, response2, body){
//The substring is too ensure it doesnt crash for the character limit yet
body = body.substring(1,10);
console.log('Api errors: ' + JSON.stringify(error));
console.log('Api body: ' + JSON.stringify(body));
if (error) {
reject();
}
resolve('api call returned: ');
});
});
}
控制台中的响应:
{
"responseMetadata": {
"status": {
"code": 10,
"message": "Failed to parse Dialogflow response into AppResponse because of empty speech response",
"details": [
{
"@type": "type.googleapis.com/google.protobuf.Value",
"value": "{\"id\":\"bca7bd81-58f1-40e7-a5d5-e36b60986b66\",\"timestamp\":\"2018-09-06T12:45:26.718Z\",\"lang\":\"nl\",\"result\":{},\"alternateResult\":{},\"status\":{\"code\":200,\"errorType\":\"success\"},\"sessionId\":\"ABwppHFav_2zx7FWHNQn7d0uw8B_I06cY91SKfn1eJnVNFa3q_Y6CrE_OAJPV-ajaZXl7o2ZHfdlVAZwXw\"}"
}
]
}
}
}
控制台中的错误:
MalformedResponse
'final_response' must be set.
答案 0 :(得分:2)
是的,这是同样的问题。
问题是您要从callNPApi()
返回一个Promise,但是您的事件处理程序(我认为是testcommand()
)不是 也会返回一个Promise。如果要在处理程序中的任何位置进行异步调用,则必须使用Promise,并且如果使用的是Promise,则还必须从处理程序中返回该Promise。
对于您来说,这应该是一个简单的更改。只需在您的处理程序中添加“返回”即可。所以可能看起来像这样
function testcommand(agent) {
return callNPApi().then((output) => {
agent.add(output);
}).catch(() => {
agent.add("That went wrong!");
});
}