код не работает при выполнении Dialogflow - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть некоторый код, который я тестировал, и он работает в моей среде, я изменил agent.add (значение) на console.log (значение), и результат был напечатан. Тем не менее, когда я пытаюсь выполнить это в диалоговом потоке, он не запускает ответ, а тело всегда неопределено.

Кто-нибудь знает, что может заставить код не работать в Dialogflow Fulfillment. Спасибо.

 function SearchKnowwledgeBaseMethod(intention){
    var username = "something";
    var password = "something";
    var auth = "Basic " + Buffer.from(username + ":" + password).toString('base64');
    var result;
    return new Promise(function(resolve, reject){
      rq(
        {
          url : `https://xxxxxx/api/now/table/kb_knowledge?sysparm_query=textCONTAINS${intention}`,
          headers : {
            "Authorization" : auth
          }
        },
        function (error, response, body) {
          if (!error && response.statusCode == 200) {
            if (typeof body !== undefined) {
              const obj = JSON.parse(body);
              if (obj.result.length > 0){
                result = obj.result[0].text;
              }
            }
          }else {
            reject("I have a problem");
          }
          resolve(result);
        });
    });
  }

  function SearchKnowledgeBase(agent){
    var intention = agent.parameters.intention;
        return SearchKnowwledgeBaseMethod(intention).then(function(result){
            if (result !== undefined){
                console.log(result);
                return agent.add(result);
            } else {
                var stringArray = intention.split(' ');
                stringArray.forEach(function (item) {
                    return SearchKnowwledgeBaseMethod(item).then(function(answer){
                        console.log(answer);
                        return console.log(answer);
                    });
                });
            }
        });
    }

  let intentMap = new Map();
  intentMap.set('Default Fallback Intent', fallback);
  intentMap.set('search_knowledge_base', SearchKnowledgeBase);
  // intentMap.set('your intent name here', yourFunctionHandler);
  // intentMap.set('your intent name here', googleAssistantHandler);
  agent.handleRequest(intentMap);

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Я нашел ответ на вопрос, который очень прост. Причина в том, что я использую бесплатную версию Firebase, поэтому она не позволяет вызывать внешний API, когда я переключаюсь на Pay as you go plan, тогда запрос API работает нормально. кредит на это видео на Youtube: https://www.youtube.com/watch?v=n4IPOeFCDxI&t=591s

0 голосов
/ 13 февраля 2020

Есть две вещи, о которых нужно позаботиться.

if (result !== undefined){
                console.log(result);
                agent.add(result); // no need to return here you are already returning a promise just do agent.add(result)
            } else {
                var stringArray = intention.split(' ');
                // I don't think you can return promises in loop for dialogflow, just return one promise 
                stringArray.forEach(function (item) {
                    return SearchKnowwledgeBaseMethod(item).then(function(answer){
                        console.log(answer);
                        return console.log(answer);
                    });
                });
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...