Как вызвать firestore getDocument в облачной функции и отправить свой ответ клиенту, используя облачную функцию? - PullRequest
0 голосов
/ 23 сентября 2018

Я новичок в javascript / nodeJS.Я пытаюсь реализовать облачную функцию http firebase, которая получает userID в своем теле.Как только он получен, мне нужно вызвать функцию getDocument из firestore и получить соответствующие данные, манипулировать этими данными и отправить обратно клиенту в ответе функции облака http.

Мой код выглядит следующим образом, я получаю пустой ответ в Почтальоне.Однако я мог заметить в журналах своего сервера следующее заявление в моем firestore getDocument печатает правильные данные.

console.log('Document data:', user);     

Однако, когда я печатаю те же данные в моей облачной функции http, она пуста.

console.log('User data:', user);

Насколько я понимаю, хотя firestore получает реальные данные, функция облака http отправляетэто ответ перед извлечением этих фактических данных, которые приводят к пустому ответу.

Оцените вашу проницательность.Заранее спасибо!

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);
let db = admin.firestore();

var getRequestedUserDetails = function (userId, db) {
  var user;
  var cityRef = db.collection('users').doc(userId);
  var getDoc = cityRef.get()
    .then(doc => {
      if (!doc.exists) {
        console.log('No such document!');
        return user;
      } else {
        user = doc.data();
        console.log('Document data:', user);
        return user;
      }
    })
    .catch(err => {
      console.log('Error getting document', err);
      throw new Error('Error getting document', err);
    });

    return user;
}

exports.helloWorld = functions.https.onRequest((request, response) => {

  if (request.method !== "POST") {
    response.status(400).send('Invalid HTTP Request');
    return;
  }

  userId = request.body.userId;

  var user = getRequestedUserDetails(userId, db);
  console.log('User data:', user);

  response.send(user);

});

1 Ответ

0 голосов
/ 23 сентября 2018

get() является асинхронным и немедленно возвращается с обещанием, которое через некоторое время разрешается с результатами запроса.Ваша функция getRequestedUserDetails возвращает user прежде, чем она когда-либо будет определена.Вместо этого, возможно, ваша функция могла бы также вернуть обещание, которое разрешается при получении результатов запроса, и вызывающая сторона могла бы использовать then() для получения своих результатов и отправки ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...