firebase - Firebase 功能 - 查询 Firestore
问题描述
我试图从云功能中的 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 个对象的数组。所以我确定查询中有一个包含数据的文档。console.log 给了我:
{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
很高兴补充一点,我为查询创建了一个(工作)索引。
解决方案
在这两种情况下,您返回的对象并不是您真正想要发送给客户端的对象。当您编写一个可调用对象时,您需要返回一个 Promise,该 Promise 解析为您要发送的确切JavaScript 对象。你不能只返回任何东西。您需要做的是将该 querySnapshot 转换为普通的旧 JavaScript 对象,这些对象描述您希望客户端知道的内容。querySnapshot 对象本身是不可序列化的——它是一个复杂的对象,描述了查询结果的许多内容。
首先定义这一点:您究竟希望客户收到什么?定义实际的 JavaScript 对象应该是什么样子。现在,将查询结果转换为如下所示。至少,您可以将整个文档集作为纯 JS 对象发送,如下所示:
return query.get().then(querySnapshot => {
return querySnapshot.docs.map(doc => doc.data());
})
这将使用原始文档对象向客户端返回一个数组。但我不清楚这就是你想要发送的(因为你没有定义你的期望)。但这是一个开始。
推荐阅读
- python - 调用另一个函数到另一个熊猫数据框文件
- javascript - 为什么 XMLElement 接口不是 Web API 的一部分?
- flutter - 如何在颤振中添加音频播放器插件?
- android - 有没有办法直接在界面中解析改造响应,用函数解析响应
- rust - 如何改变静态引用使用大小?
- google-bigquery - 在 BigQuery 中使用变量来计算其他变量
- php - Symfony Translation - 翻译在命令中生成的 PDF
- python - 使用 selenium 将“driver.find_element_by_css_selector”置于 if 条件下时出现问题
- apache-flink - 如何在 KeyedStream 中获取槽分布
- swift - Firebase 发布请求 Swift/SwiftUI 已弃用