Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use Async Functions in DialogFlow WebHook

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);
like image 550
Utsav Preet Avatar asked May 19 '18 06:05

Utsav Preet


People also ask

How do you increase webhook timeout in Dialogflow?

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.

What is webhook in Dialogflow?

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.


1 Answers

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.

like image 137
Prisoner Avatar answered Sep 30 '22 06:09

Prisoner