node.js - 如何从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);
});
}
解决方案
我在测试您的代码时观察到的是,触发函数无需等待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);
});
});
推荐阅读
- sql-server - 在 Azure SQL Server 上安装“分析服务”?
- node.js - cookie 设置在 `/set-cookie` 位置,但无法使用 express.js 在 `/user` 检索
- python-3.x - Tweepy 编码错误:UnicodeEncodeError:“UCS-2”编解码器无法对位置 14-14 中的字符进行编码:Tk 中不支持非 BMP 字符
- c# - C# 合并 4x 图像创建单个图像,但使用这些特殊图像不起作用
- wix - 未为安静安装设置 Wix 目录 ID 符号值
- java - Java 8 而不是简单的 java
- ruby-on-rails - 读取rails种子文件后图像文件被删除
- python - 关键字不包含在模块的符号表中
- terraform - 如何使用 Terraform 模块进行跨账户工作
- java - 汤。我正在尝试从具有多个具有编译器不喜欢的奇怪名称的类的跨度中获取文本