【发布时间】:2018-03-19 14:38:03
【问题描述】:
我有一个 DialogFlow V2 node.js webhook。
我有一个通过 webhook 操作调用的意图:
const { WebhookClient } = require('dialogflow-fulfillment');
const app = new WebhookClient({request: req, response: res});
function exampleIntent(app) {
app.add("Speak This Out on Google Home!"); // this speaks out fine. no error.
}
现在,如果我有一个成功完成的异步请求,并且我在成功块中执行 app.add,如下所示:
function exampleIntent(app) {
myClient.someAsyncCall(function(result, err) {
app.add("This will not be spoken out"); // no dice :(
}
// app.add("but here it works... so it expects it immediately");
}
...然后对话流不等待语音返回。我在 Response 对象中得到错误:
"message": "Failed to parse Dialogflow response into AppResponse, exception thrown with message: Empty speech response",
如何让 DialogFlow V2 等待 Webhook 的异步操作完成,而不是立即期待语音响应?
注意:此问题仅在 V2 中开始出现。在 V1 中,app.ask 在异步调用的尾端运行良好。
exampleIntent 被应用程序的主映射器调用,如下所示:
let actionMap = new Map();
actionMap.set("my V2 intent name", exampleIntent);
app.handleRequest(actionMap);
我在 myClient.someAsyncCall 中的异步请求正在使用 Promises:
exports.someAsyncCall = function someAsyncCall(callback) {
var apigClient = getAWSClient(); // uses aws-api-gateway-client
apigClient.invokeApi(params, pathTemplate, method, additionalParams, body)
.then(function(result){
var result = result.data;
var message = result['message'];
console.log('SUCCESS: ' + message);
callback(message, null); // this succeeds and calls back fine.
}).catch( function(error){
console.log('ERROR: ' + error);
callback(error, null);
});
};
【问题讨论】:
-
您能否更新您的问题以包括您如何调用
exampleIntent()函数? -
我已经做到了。 exampleIntent 由映射到 DialogFlow 中的 Intent Name 的主映射器调用。然后“someAsyncCall”在后台使用 AWS 库和承诺。我基本上需要让我的 webhook 等待响应......
标签: node.js actions-on-google dialogflow-es api-ai