Получить тело json через обратный вызов функции для api.ai

Я использую firebase для размещения облачных функций, так как для многих функций (примерно для каждой) мне нужно сделать http-запрос и получить тело json, чтобы получить от него данные. Однако обратный вызов у ​​меня работает не очень хорошо, я искал некоторые существующие ответы, но все еще застрял на этом. Вот фрагмент кода, параметры объявлены ранее, и если я не помещаю запрос в get_request_handler, он работает нормально.:

function get_request_handler(assistant, input_url, callback) {
  req(options, function (error, response, body) {
     if (!error && response.statusCode == 200) {
      var cookie = req.cookie('BPMSTS=' + body );
      var headers = {
          'Content-Type': 'application/json',
          'Cookie': cookie
      };
      var option = {
          url: input_url,
          method: 'GET',
          headers: headers
      }
      req(option, function(error, res, body) {
          assistant.ask(input_url);
          if (!error && res.statusCode == 200) {
              callback(JSON.parse(body));
          } else {
              assistant.ask('inner request with error code: ' + (res.statusCode).toString());
          }
      });
     } else {
      assistant.ask('outer request with error code: ' + (response.statusCode).toString());
    }
  });
}

Я вызываю функцию следующим образом:

get_request_handler(assistant, workflow_url, function(cur_json){assistant.ask(cur_json);});

Проблема сейчас в том, что первый запрос не может быть сделан в функции get_request_handler. Другими словами, он входит только в get_request_handler, но не входит в тело запроса. Если я не создам get_request_handler и не оставлю req(options, function (error, response, body) { ... }, он будет работать без проблем. Есть идеи по этому поводу?

Примечание. Я только что проверил журнал Firebase, и он говорит для этой строки: req(options, function (error, response, body) он получил TypeError: Назначение постоянной переменной. at get_request_handler (/user_code/index.js:116:13)


person Will Yuling Liu    schedule 16.08.2017    source источник


Ответы (1)


Здесь у вас много проблем, но основная из них заключается в том, что вы пытаетесь вызвать assistant.ask() более одного раза в своем ответе пользователю. После вызова assistant.ask() дальнейшие ответы не могут быть отправлены, и ни один из других вызовов ask() не будет обработан.

Похоже, вы используете его для отладки. Это кажется действительно плохим выбором, когда вы должны использовать console.log().

Вы также указали, что используете функции Firebase. Обратите внимание, что вызовы из функции Firebase ограничены, если вы используете бесплатный план. Если вы используете один из платных планов, ограничений нет, и есть бесплатный уровень, которого должно быть более чем достаточно для тестирования.

person Prisoner    schedule 16.08.2017
comment
Привет Заключенный. Да, у меня платный план, поэтому я могу делать внешние запросы, не помещая запрос в get_request_handler. Ну, я не вызывал Assistant.ask() дважды, когда я его вызываю, другой будет закомментирован. Я предполагаю, что единственная проблема здесь будет заключаться в том, почему он не может войти в тело запроса, если я поместил его в функцию? - person Will Yuling Liu; 16.08.2017
comment
Тогда я не уверен, что понимаю проблему, а также то, что вы имеете в виду, почему она не может войти в тело запроса, если я поместил ее в функцию. Пожалуйста, обновите свой первоначальный вопрос, указав, что вызывается, а что нет или к чему вы можете и не можете получить доступ. - person Prisoner; 16.08.2017
comment
Отредактировано. Если есть еще что-то неясное, дайте мне знать! Заранее спасибо. - person Will Yuling Liu; 16.08.2017