使用agent.add()

时间:2018-07-10 09:04:25

标签: dialogflow beta

我的要求是使用Dialogflow的Nodejs履行库Beta发送带有响应的动态数据。

我的查询是要知道是否有可能通过外部api发送带有响应的动态数据?在某些情况下,我们需要通过调用API将实时数据发送给dialogflow代理(进而发送给客户端)。我尝试在下面的代码中实现此功能,但无法正常工作,这里的“值”是我们从api响应中获取的数据,并且已经对其进行了解析/导航以提取json值。

agent.add(股票价格为JSON.parse(值).IRXML.StockQuotes.Stock_Quote [0] .Trade)

在执行代码之前,我正在使用Promotion进行同步外部API调用,以便在agent.add部分中替换结果。

目前,我无法在升级内执行agent.add函数,然后再执行功能。请协助我实施此操作,或者让我知道是否有其他替代方法可以做到这一点。

我正在进行外部api调用以获取数据,以便可以将相同结果发送回代理。我可以打电话,但是我真的不确定如何将收到的数据传递给代理。如下面的代码所示,im调用externalCall()进行api调用,此函数从SpineDay()调用。从externalCall()返回的结果将替换为SpineDay(),但仍不会使用agent.add()将结果传递给代理。任何在“ externalCall(req,res).then”中的agent.add()指令均无效。

    function SpineDay(agent){



        externalCall(req,res).then((output,agent) => {

                //res.json({ 'fulfillmentText':  JSON.parse(output).IRXML.StockQuotes.Stock_Quote[0].Trade }); 
                 agent.add(new Card({
                        title: output,
                        imageUrl: 'https://dialogflow.com/images/api_home_laptop.svg',
                        text: `This is the body text of a card.  You can even use line\n  breaks and emoji!`,
                        buttonText: 'Se rendre sur XXX',
                        buttonUrl: 'https://XXX/'
                        })
                    );
                    agent.add(new Suggestion(`Quelles sont les dernière sorties à la demande?`));
                    agent.add(new Suggestion(`Quel est le programme de ce soir?`));
              }).catch(() => {
                res.json({ 'fulfillmentText': `Error calling the weather API!` });
              });

          /*agent.add("Quelles sont les dernière sorties à la demande?");
            agent.add("`Quel est le programme de ce soir?");*/
  } 



var  externalCall = function(mainreq, mainres) { 
      return new Promise(function(resolve, reject){
        // Create the path for the HTTP request to get the weather
          var jsonObject = JSON.stringify(mainreq.body);
          const agent = new WebhookClient({request: req, response: res});
          console.log('In side post code' + Buffer.byteLength(jsonObject, 'utf8'))
          // An object of options to indicate where to post to
          var options = {
              port: '443',
              uri: 'https://xxxx.xxx.xxx//ticker/quote/stock?compid=22323&reqtype=quotes',
              method: 'POST',
              headers: {
                  'Content-Length' : Buffer.byteLength(jsonObject, 'utf8'),
                  'X-MDT-API-KEY': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'    
              }
          };

        // Make the HTTP request to get the weather
        request(options, function(err, res, body) { 

          if (!err && res.statusCode == '200'){
            // After all the data has been received parse the JSON for desired
            // data
            let response = JSON.parse(body).IRXML.StockQuotes.Stock_Quote[0].Trade;


            // Create response
            let output = "xxxx stock price is " +response;

            // Resolve the promise with the output text
            console.log(body);
            resolve(output,agent);
          }else{
              console.log(`Error calling the weather API: ${error}`)
                reject("Error calling the weather API");
          }


        });
      });
    }

1 个答案:

答案 0 :(得分:0)

问题是您的for rows in reader: k = rows[0].strip('"\'') v = rows[1].strip('"\'') mydict[k] = v print(mydict.get('000000')) 函数正在进行asyc调用,但未返回Promise。尽管SpineDay(正确)正在使用Promises,但externalCall不是。该库假设,如果您进行异步调用,您将返回一个Promise,该Promise将在准备好发送响应时完成。

幸运的是,您可以在函数中添加一些额外的行来完成此任务,这些行会整体返回一个Promise,并在Promise链中返回Promise。

SpineDay

因此,首先,您需要返回 function SpineDay(agent){ return externalCall(req,res) .then((output,agent) => { agent.add(new Card({ title: output, imageUrl: 'https://dialogflow.com/images/api_home_laptop.svg', text: `This is the body text of a card. You can even use line\n breaks and emoji!`, buttonText: 'Se rendre sur XXX', buttonUrl: 'https://XXX/' }) ); agent.add(new Suggestion(`Quelles sont les dernière sorties à la demande?`)); agent.add(new Suggestion(`Quel est le programme de ce soir?`)); return Promise.resolve(); }).catch(() => { res.json({ 'fulfillmentText': `Error calling the weather API!` }); return Promise.resolve(); }); } 链的结果,这将是一个Promise。然后,在链中还需要返回结果,最好将其作为一个承诺来完成。