Используйте асинхронные функции в DialogFlow WebHook - PullRequest
0 голосов
/ 19 мая 2018

Обращаясь к решению, опубликованному здесь ( DialogFlow V2 Webhook - ожидает речевые ответы сразу, а не после асинхронных запросов )
Что я хочу достичь, так это то, что веб-ловушка должна ждать, пока я не получу ответиз моего вызова API.PS: API работает, просто бот не ждет ответа.Любая помощь будет принята с благодарностью.Спасибо

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);

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Вы не указали, в какой среде вы работали, но, учитывая ваш код и описанное выше изменение agent.parameters, я смог продублировать вашу проблему с помощью облачных функций Firebase с node.js 6.14.

Мне удалось заставить его работать, используя пакет request-promise-native вместо request-promise.Как следует из названия, здесь используются нативные обещания вместо пакета Bluebird Promise, но в остальном вы делаете идентичные звонки.

0 голосов
/ 20 мая 2018

Логика Promise выглядит хорошо, но эта строка не имеет смысла:

let params = request.body.result.parameters;

Нет объекта request, который находится в области видимости.

Вы можете получить параметрыдля запроса от agent.parameters.

...