Как вызвать API внутри облачной функции? - PullRequest
0 голосов
/ 06 марта 2019

Я работаю над чат-ботом Google с помощью Dialogflow и облачных функций.Время выполнения - Node.js 6.

Почему эта функция возвращает пустую строку?

function getJSON(url) {
  var json = "";
  var request = https.get(url, function(response) {
    var body = "";
    json = 'response';
    response.on("data", function(chunk) {
      body += chunk;
      json = 'chunk';
    });
    response.on("end", function() {
      if (response.statusCode == 200) {
        try {
          json = 'JSON.parse(body)';
          return json;
        } catch (error) {
          json = 'Error1';
          return json;
        }
      } else {
        json = 'Error2';
        return json;
      }
    });
  });
  return json;
}

Это намерение, в котором я хочу получить доступ к данным json:

app.intent('test', (conv) => {
conv.user.storage.test = 'no change';
const rp = require("request-promise-native");
var options = {
    uri: 'https://teamtreehouse.com/joshtimonen.json',
    headers: {
        'User-Agent': 'Request-Promise'
    },
    json: true // Automatically parses the JSON string in the response
};

rp(options)
    .then(function (user) {
        conv.user.storage.test = user.name;
    })
    .catch(function (err) {
        conv.user.storage.test = 'fail';
    });
conv.ask(conv.user.storage.test);
});

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Функция возвращает пустую строку, потому что https устанавливает функцию обратного вызова, но поток программы продолжает выполнение оператора возврата до вызова обратного вызова.

В общем, при работе с обработчиками намерений Dialogflow,вы должны возвращать обещание вместо использования обратных вызовов или событий.Попробуйте использовать request-обещание-native .

Два уточняющих момента:

  • Вы должны вернуть Обещание.В противном случае Dialogflow будет считать, что обработчик завершен.Если вы вернете Обещание, оно будет ждать его завершения.
  • Все, что вы хотите отправить обратно, должно быть выполнено внутри блока then().Это включает в себя настройку любого ответа.Блок then() запускается после завершения асинхронной операции (вызова веб-API).Таким образом, это будет иметь результаты вызова, и вы можете вернуть эти результаты в своем вызове на conv.ask().

Так что это может выглядеть примерно так:

  return rp(options)
    .then(function (user) {
      conv.add('your name is '+user.name);
    })
    .catch(function (err) {
      conv.add('something went wrong '+err);
    });
0 голосов
/ 06 марта 2019

Вы можете попробовать использовать модуль request для node.js, я попытался самостоятельно воспроизвести ваш сценарий использования и работал нормально.Код должен быть примерно таким:

const request = require('request');

request(url, {json: true}, (err, res, body) => {
  if (err) { res.send(JSON.stringify({ 'fulfillmentText': "Some error"})); }
    console.log(body);
  });

Кроме того, вам необходимо добавить "request": "2.81.0" в раздел dependencies внутри файла package.json.

...