Как получить данные из RESTful API с помощью диалогового потока - PullRequest
0 голосов
/ 29 ноября 2018

Я немного борюсь со своим помощником в Google.Прямо сейчас я использую Dialogflow и Firebase для моего webhook.В моем коде я хотел бы получить данные из API, например, такого: API .Я кодирую с Node.js, кстати.Поскольку узел является асинхронным, я не знаю, как получить данные.Когда я пытаюсь сделать обратный вызов, он не работает, например:

app.intent(GetData, (conv) => {
  var test= "error";

  apicaller.callApi(answer =>
    {
      test = answer.people[0].name
      go()

    })
    function go ()
    {
    conv.ask(`No matter what people tell you, words and ideas change the world ${test}`)
    }

По какой-то причине это работает, когда я тестирую его в другом приложении.С Dialogflow он не работает

Я также пытался использовать асинхронную для функции app.intent и пробовал с await, но это тоже не сработало.

Есть ли у вас какие-либо идеи, как яможет это исправить?

Заранее спасибо и наилучшими пожеланиями

Лука

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Вам необходимо вернуть Promise, например

function dialogflowHanlderWithRequest(agent) {
  return new Promise((resolve, reject) => {
    request.get(options, (error, response, body) => {
      JSON.parse(body)
      // processing code
      agent.add(...)
      resolve();
    });
  });
};

Подробнее см. Ниже:

Выполнение диалога NodeJs V2 - вызов метода webhook заканчивается до завершения обратного вызова

0 голосов
/ 29 ноября 2018

Если это работает в другом приложении, то я полагаю, что вы получаете сообщение об ошибке, потому что вы пытаетесь получить доступ к внешнему ресурсу при использовании бесплатного плана Spark от Firebases, который ограничивает вас только службами Google.Вам нужно будет перейти на оплату по мере поступления План Blaze для выполнения исходящих сетевых задач.

0 голосов
/ 29 ноября 2018

Из-за асинхронности функция go() будет вызываться после выполнения обратного вызова callapi.

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

app.intent(GetData, async (conv) => {
    var test= "error";

    apicaller.callApi(async answer =>
      {
        test = answer.people[0].name
        await go()

      })
      async function go ()
      {
      conv.ask(`No matter what people tell you, words and ideas change the world ${test}`)
      }
...