Referring to the solution posted here (DialogFlow V2 Webhook - Expects Speech responses Immediately and not after async requests)
What I want to achieve is that the web hook should wait until I get a response from my api call.
P.S: The API is working, its just that the bot doesn't wait for the response to come.
Any help would be greatly appreciated. Thanks
const rp = require('request-promise');
function convert(params){
return rp('https://data.fixer.io/api/convert?access_key=[my key]&from='+
params['currency-from']+'&to='+params['currency-to']+'&amount='+params.amount)
.then((data) => {
let responseData = JSON.parse(data);
let message = responseData.result;
console.log('Success');
return Promise.resolve(message);
}).catch((err)=> {
return Promise.reject(err);
});
}
function currencyConversion(agent) {
let params = request.body.result.parameters;
return convert(params)
.then((message)=> {
agent.add(`${params.amount} ${params['currency-from']} is ${message} ${params['currency-to']}`);
return Promise.resolve()
})
.catch((err) => {
console.log(err);
agent.add("Uh oh, something happened.");
return Promise.resolve();
})
}
let intentMap = new Map();
intentMap.set('Default Welcome Intent', welcome);
intentMap.set('Default Fallback Intent', fallback);
intentMap.set('currency.convert', currencyConversion);
By default, webhook timeout is 5 seconds. However, in Dialogflow CX, you can go to Manage > Webhook, select the webhook you are using and increase the timeout to up to 30 seconds.
In Dialogflow, a webhook can be used to fetch data from your server whenever a certain intent having webhook enabled (don't worry, we will see that) is invoked. The information from the intent is passed to the webhook service to receive result.
You didn't state what environment you were running in, but given your code, and the agent.parameters
change I outlined above, I was able to duplicate your problem using Firebase Cloud Functions with node.js 6.14.
I was able to get it to work by using the request-promise-native
package instead of request-promise
. As the name suggests, this uses native Promises instead of the Bluebird Promise package, but otherwise the calls you're making are identical.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With