Firebase 在云功能中访问云firestore文档
在我的Google Firebase Firstore数据库中,我想收集聚合数据,例如一个集合有多少文档。由于Firestore不提供聚合查询,因此我正在尝试编写一个云函数,该函数将在每次将文档添加到数据库时增加一个字段,该数据库将包含集合拥有的文档数 我面临的问题是,我一辈子都无法弄清楚如何使用nodejs从云函数中的Firestore获取文档 以下是我正在做的: 在我的Firebase 在云功能中访问云firestore文档,firebase,google-cloud-functions,google-cloud-firestore,Firebase,Google Cloud Functions,Google Cloud Firestore,在我的Google Firebase Firstore数据库中,我想收集聚合数据,例如一个集合有多少文档。由于Firestore不提供聚合查询,因此我正在尝试编写一个云函数,该函数将在每次将文档添加到数据库时增加一个字段,该数据库将包含集合拥有的文档数 我面临的问题是,我一辈子都无法弄清楚如何使用nodejs从云函数中的Firestore获取文档 以下是我正在做的: 在我的index.js文件的顶部,我配置了管理员SDK以及您喜欢的内容: const functions = require('f
index.js
文件的顶部,我配置了管理员SDK以及您喜欢的内容:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
然后,对于我的云功能,我执行以下操作:
exports.createPost = functions.firestore
.document('posts/{post_id}')
.onCreate(event => {
// Get the post object
var post = event.data.data();
var senderID = post["sender_id"]; // This is not null
// Access to user's document and the main ledger document
const userDocRef = admin.database().ref('/users').orderByChild("user_id").equalTo(senderID).once('value')
const ledgerDocRef = admin.database().ref('/posts/ledger').once('value');
return Promise.all([userDocRef, ledgerDocRef]).then(snapshot => {
const user = snapshot[0].val();
const ledger = snapshot[1].val();
console.log("user => "+user); // Logs: user => null
console.log("ledger => "+ledger); // Logs: ledger => null
const userPostCount = user["user_name"];
const globalPostCount = ledger["global_post_count"] + 1;
const userUpdate = user.update({"post_count" : userPostCount});
const ledgerUpdate = ledger.update({"global_post_count" : globalPostCount});
return Promise.all([userUpdate, ledgerUpdate]);
});
});
我最后得到了一个错误:
TypeError:无法读取null的属性“global\u post\u count”
好的,那就拍快照吧
我想这意味着我的问题出了问题,但我不知道是什么。用户
和帖子
都是根级别的集合
我还收到一条警告,上面写着:
未配置计费帐户。外部网络不可访问且
配额受到严格限制
从我在网上读到的,我不认为这会影响它,但我认为这是值得注意的
请提供帮助。看起来您已经编写了Firestore触发器,但随后将进入实时数据库进行查询:
const userDocRef = admin.database().ref('/users').orderByChild("user_id").equalTo(senderID).once('value')
const ledgerDocRef = admin.database().ref('/posts/ledger').once('value');
如果您的RTDB为空,这些查询也将以空结束
要查询Firestore,您需要使用
admin.Firestore()
而不是admin.database()
。Firestore(通过我刚刚链接的云SDK)比RTDB更具吸引力,但它们在某些方面是相似的。Ohhh我现在明白了,这是非常巧妙的。感谢您的回答,在过去的几个小时里,我在这件事上一直碰壁。@DougStevenson-我遇到了类似的问题,并尝试在我的云函数functions.https.onCall()
中使用admin.firestore().ref('qa/content/feed/main/content/'+contentTitle.)get()键入call。然后(function(doc){…}
但是我收到了错误未处理的错误类型error:admin.firestore(…).ref不是一个函数@AdamHurwitz,您可能需要导入firebase admin
sdk。如果您仍然遇到此问题,请尝试在代码前面添加以下行:const admin=require('firebase-admin'));admin.initializeApp();