首页 > 解决方案 > 如何从firestore云函数中的常用函数获取返回值

问题描述

我对 Firebase 的 Google Cloud Function 有点陌生。我正在尝试构建一个通用函数,它可以返回类似于下面的 JSON 对象。但是,看起来函数返回的值不是有效对象。你能帮我如何处理返回值吗?

exports.dataUpdation = functions.firestore.document('/userReq/{document}').onWrite(async (snap, Context)   => {

var result = JSON.parse(JSON.stringify(snap.after.data()));
var userID = result.userID;

// Want to get returned value from userData (userID,"custProfile")
retunedData = get_userData (userID,collection_name)

console.log("Person's Nickname is " + retunedData.nickName);

});

 function get_userData (userID,collection_name) {

    var userID = doc_userRequirement.userID;

    var queryCustomerProfile = db.collection(collection_name).where("userID", "==", userID);

    queryCustomerProfile.get().then((doc_queryCustomerProfile) => {
      
       
            var CustomerProfile = JSON.parse(JSON.stringify(doc_queryCustomerProfile.docs[0].data()));
            console.log("Nickname printed from get_userData function - "+CustomerProfile.nickName);
            retuningData = { "userId": userID, "nickName" : CustomerProfile.nickName};
            return retuningData;
        

    }).catch(error => {
        console.log("Error getting document:", error);
        
    });

}

标签: node.jsfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


我在测试您的代码时观察到的是,触发函数无需等待get_userData(). 这是因为触发函数的异步性质。

我建议您设计这样的代码,而不是创建一个单独的函数,这样您就不会遇到异步问题:

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

admin.initializeApp({
    credential: admin.credential.applicationDefault()
  });

const db = admin.firestore();
const userID = 'YOUR_USER_ID';
const collection_name = 'YOUR_COLLECTION_NAME';

exports.dataUpdation = functions.firestore.document('/userReq/{document}').onWrite(async (snap, Context)   => {
    var result = JSON.parse(JSON.stringify(snap.after.data()));

    // Get User Data 
    await db.collection(collection_name).where("userID", "==", userID).get().then((doc_queryCustomerProfile) => {       
      var CustomerProfile = JSON.parse(JSON.stringify(doc_queryCustomerProfile.docs[0].data()));
      console.log("Nickname printed from get_userData function - "+CustomerProfile.nickName);

      var retunedData = { "userId": userID, "nickName" : CustomerProfile.nickName};
      console.log("Person's Nickname is " + retunedData.nickName);
    }).catch(error => {
        console.log("Error getting document:", error);
    }); 
});

输出: 输出


推荐阅读