Возврат асинхронной функции Node / Firebase onCall - PullRequest
0 голосов
/ 27 августа 2018

Пользователь вводит сообщение в чат-клиент (веб-сайт).Это сообщение отправляется в облачную функцию, настроенную на базе Firebase.Облачная функция затем запрашивает сторонний API, который возвращает ответ.Этот ответ необходимо отправить обратно клиенту для отображения.

Так что в основном мой клиент вызывает облачную функцию примерно так ...

var submitMessage = firebase.functions().httpsCallable('submitMessage');
submitMessage({message: userMessage}).thenfunction(result) {
  //Process result
});

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

exports.submitMessage = functions.https.onCall((data, context) => {
  request({
    url: URL,
    method: "POST",
    json: true,
    body: queryJSON //A json variable I've built previously
  }, function (error, response, body) {
    //Processes the result (which is in the body of the return)
  });

return {response: "Test return"};
});

Я включил пакет запроса, и сам вызов API работает отлично.Я могу вывести результат на консоль из функции возврата запроса.Однако, очевидно, поскольку запрос асинхронный, я не могу просто создать глобальную переменную и присвоить ей тело результата.Я видел, что вы можете вызвать функцию обратного вызова после завершения запроса.Однако мне нужно каким-то образом передать это через возвращаемое значение функции облака.Проще говоря, мне нужно сделать это ...

exports.submitMessage = functions.https.onCall((data, context) => {

var gBody;

request({
    url: URL,
    method: "POST",
    json: true,
    body: queryJSON //A json variable I've built previously
  }, function (error, response, body) {
    gBody = body;
  });

return gBody;
});

(Да, я знаю об этом сообщении ... Как мне вернуть ответ от асинхронного вызова? но да, как я уже сказал, мне нужно, чтобы переменная область видимости находилась внутри самой облачной функции, чтобы я мог вернуть значение клиенту. Либо я не понимаю методы, использованные в этом посте, либо он не выполняет то, что япрошу)

1 Ответ

0 голосов
/ 27 августа 2018

Подход в вашем последнем фрагменте не может работать: к тому времени, когда ваш return gBody запускает обратный вызов из стороннего API, еще не был вызван, поэтому gBody пуст.

Какдокументация по облачным функциям гласит:

Чтобы вернуть данные после асинхронной операции, верните обещание.Данные, возвращаемые обещанием, отправляются обратно клиенту.

Таким образом, вы просто возвращаете обещание, а затем разрешаете это обещание с помощью данных от стороннего API.

exports.submitMessage = functions.https.onCall((data, context) => {
  return new Promise(function(resolve, reject) {
    request({
      url: URL,
      method: "POST",
      json: true,
      body: queryJSON //A json variable I've built previously
    }, function (error, response, body) {
      if (error) {
        reject(error);
      } 
      else {
        resolve(body)
      } 
    });
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...