агент диалога не выводит текст изнутри обратного вызова HTTP-запроса - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь получить данные с внешнего сайта, инициированные желанным намерением.Сейчас я пытаюсь выполнить простой запрос GET на google.com.

. Агент работает, как и ожидалось, за исключением случаев, когда он вызывается из обратного вызова запроса.Иногда это работает, а иногда нет.

'use strict';    
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
process.env.DEBUG = 'dialogflow:debug'; 

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });

  function search(agent){

          var request = require("request");
          var options = {
            method: 'GET',
            url: 'http://google.com'
          };

          console.log("Before request");
          agent.add("Before request");

          request(options, function (error, response, body){
            console.log("Request completed");
            agent.add("Request completed");     //<- This line doesn't show in agent
            console.log("finished");            //<- This line shows in the log
          });

          console.log("Request sent");
          agent.add(`Request sent`);
  }

  let intentMap = new Map();
  intentMap.set('Default Welcome Intent', search);
  agent.handleRequest(intentMap);
});

Я заметил в журнале сообщение, которое "Function execution took 1697 ms, finished with status code: 200" показывает перед сообщением "finished".Я не знаю, означает ли это, что процесс закрывается и игнорирует вызовы agent.add() после этой точки.

Изображение: консоль журнала firebase, показывающая завершение функции, завершенной до того, как запрос выполнен

1 Ответ

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

Проблема с обратным вызовом / обещанием.Вам нужно вернуть обещание внутри функции поиска.

function search(agent, query){
    return new Promise((resolve, reject) => {
      request.get(options, (error, response, body) => {
      .....
      agent.add(...)
      resolve();
     });
   });
};

Оригинальный ответ можно найти в следующем выпуске Github:

https://github.com/dialogflow/dialogflow-fulfillment-nodejs/issues/3

РЕДАКТИРОВАТЬ:

Получил небольшую помощь от службы поддержки DialogFlow.Мне немного не хватало предложенного кода для правильной работы:

function search(agent, query){
  return new Promise((resolve, reject) => {
    request.get(options, (error, response, body) => {
      .....
      let output = agent.add(...)
      resolve(output);  //<- agent.add() should be passed as argument in resolve()
    });
  });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...