我试图在云函数中从firestore中检索一些数据,但一无所获。客户端上的相同查询为我提供了正确的结果。这可能是一件小事,但我不认为有什么问题。我做错了什么?
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
db.settings({ timestampsInSnapshots: true });
exports.myFunction = functions.https.onCall((data, context) => {
const info = getInfo();
//do some stuff with the info
return info;
}
function getInfo() {
const query = db
.collection('info')
.where('table_nr', '==', 1)
.where('number', '<=', 25)
.orderBy('number', 'desc')
.limit(1);
const info = query.get().then(snapshot => {
snapshot.forEach(doc => {
return doc.data();
})
})
return info;
}
当我调用这个函数时,我得到:"data:null">
let info = functions.httpsCallable('myFunction')
info().then(res => { console.log(res) })
我尝试了很多不同的选择,比如当我把最后一部分改为:
const info = query.get().then(snapshot => {
snapshot.docs;
})
我得到一个有1个对象的数组。因此,我确信查询中有一个包含数据的文档。控制台日志给了我:
{data: Array(1)}
data: Array(1)
0: {_ref: {…}, _fieldsProto: {…}, _serializer: {…}, _validator: {…},
_readTime: {…}, …}
length: 1
__proto__: Array(0)
__proto__: Object
和:
return query.get().then(querySnapshot => {
if (querySnapshot.empty) {
return { exists: false }
} else {
return { exists: true }
}
})
控制台日志:
{data: {…}}
data:
exists: true
__proto__: Object
__proto__: Object
Mabye很好地补充说,我为查询创建了一个(工作)索引。
在这两种情况下,您都会返回一个对象的promise,而该对象并不是您真正想要发送给客户端的对象。编写可调用时,需要返回一个promise,该promise解析为要发送的精确JavaScript对象。你不能只归还任何东西。您要做的是将querySnapshot转换为简单的旧JavaScript对象,这些对象描述了您希望客户端了解的内容。querySnapshot对象本身是不可序列化的——它是一个复杂的对象,描述了有关查询结果的许多内容。
首先定义:您希望客户端接收什么?定义实际的JavaScript对象应该是什么样子。现在,将查询结果转换为这样。至少,您可以将整个文档集作为如下的纯JS对象发送:
return query.get().then(querySnapshot => {
return querySnapshot.docs.map(doc => doc.data());
})
这将向客户端返回一个带有原始文档对象的数组。但我不清楚这是你想要发送的(因为你没有定义你的期望)。但这只是一个开始。
因此,为Firebase Cloud Functions 提供一个使用Firebase Functions库中where的清晰示例
admin.firestore().collection("fruit")
.where("color", "==", "purple")
订购
admin.firestore().collection("fruit").orderBy("size")
.where("color", "==", "purple")
如果你想了解更多关于管理员如何使用的详细信息,请参阅演示文档
此外,在query类中可以找到所有查询函数的列表。可以通过使用方法链接从Firestore函数库中使用,就像我的两个例子一样,以防您想要";"极限"偏移";,等