在DialogFlow WebHook中使用异步函数

时间:2018-05-19 06:20:28

标签: node.js actions-on-google dialogflow

参考此处发布的解决方案(DialogFlow V2 Webhook - Expects Speech responses Immediately and not after async requests
我想要实现的是web挂钩应该等到我从api调用得到响应。 P.S: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 :(得分:4)

您没有说明您正在运行的环境,但考虑到您的代码以及上面概述的agent.parameters更改,我能够使用带有node.js 6.14的Firebase云功能复制您的问题。< / p>

我可以使用request-promise-native包而不是request-promise来使其工作。顾名思义,这使用本机Promises而不是Bluebird Promise包,但是你正在进行的调用是相同的。

答案 1 :(得分:1)

Promise逻辑看起来很合理,但这条线没有意义:

UsedRange.Rows.Count

范围内没有let params = request.body.result.parameters; 个对象。

您可以从request获取请求的参数。