如何在云功能中调用firestore getDocument并使用云功能将其响应发送回客户端?

时间:2018-09-23 03:53:49

标签: javascript node.js firebase google-cloud-firestore google-cloud-functions

我是javascript / nodeJS的新手。我正在尝试实现一个http firebase云函数,该函数在其主体中接收userID。收到后,我需要调用firestore的getDocument函数并获取其对应的数据,使用这些数据进行操作,然后在http cloud函数响应中发送回客户端。

我的代码如下,我在邮递员中得到了空响应。但是我可以在服务器日志中注意到,在Firestore中的以下语句getDocument打印正确的数据。

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

但是,当我在http cloud函数中打印相同的数据时,该数据为空。

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 :(得分:0)

get()是异步的,并立即以承诺返回,该承诺将在以后的查询结果中解决一些未知时间。函数getRequestedUserDetails在定义之前将返回user。相反,也许您的函数还可以返回在查询结果时解析的promise,并且调用方可以使用then()来接收其结果并发送响应。