DialogFlow V2 Webhook: espera respuestas de voz inmediatamente y no después de solicitudes asíncronas
Tengo un webhook DialogFlow V2 node.js.
Tengo una intención que se llama con una acción 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.
}
Ahora, si tengo una solicitud asincrónica que finaliza con éxito, y lo hagoapp.add en el bloque de éxito Me gusta esto:
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");
}
... entonces Dialog Flow no espera a que se devuelva el discurso. Me sale el error en el objeto Respuesta:
"message": "Failed to parse Dialogflow response into AppResponse, exception thrown with message: Empty speech response",
¿Cómo puedo hacer que DialogFlow V2 espere a que se completen las operaciones asíncronas de Webhook en lugar de esperar una respuesta de voz de inmediato?
NOTA: Este problema solo comenzó a suceder en V2. En V1, app.ask funcionó bien al final de las llamadas asíncronas.
ejemplo: El mapeador principal de la aplicación está llamando a Intent de la siguiente manera:
let actionMap = new Map();
actionMap.set("my V2 intent name", exampleIntent);
app.handleRequest(actionMap);
Y mi solicitud asíncrona dentro de myClient.someAsyncCall está usando Promesas:
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);
});
};