目前我正在开发一个项目,我想将数据从 firebase 获取到 ESP32,由于 RAM 限制,我想一次处理 10 个 JSON 对象。我有以下 javascript 函数来请求数据:
exports.getData = functions.https.onRequest((request, response) => {
const path = request.query.path;
const limit = parseInt(request.query.limit, 10) || 10;
const startAtValue = request.query.startAt;
if (!path) {
return response.status(400).send("Path query parameter is required");
}
const ref = admin.database().ref(path);
let query = ref;
if (startAtValue) {
query = query.startAt(startAtValue);
}
query = query.limitToFirst(limit);
query
.once("value", (snapshot) => {
const data = snapshot.val();
response.send(data);
})
.catch((error) => {
console.error("Error fetching data:", error);
response.status(500).send(error);
});
});
当我发出第一个请求时它就起作用了:
https://[REGION]-[PROJECT_ID].cloudfunctions.net/getData?path=/path/to/data&limit=11
我得到这样的数据
{
"77303837": "77303837,12,-16,0",
"77303868": "77303868,12,-16,0",
"77303929": "77303929,12,-16,0",
"77304889": "77304889,14,-16,0",
"77304971": "77304971,12,-16,0",
"77305435": "77305435,14,-16,0",
"4072700001089": "4072700001089,0,0,0",
"4792128005888": "4792128005888,0,0,0",
"5410228202929": "5410228202929,2,0,0",
"5410228217732": "5410228217732,0,0,0",
"5410228243564": "5410228243564,1,0,0"
}
但是当我执行第二个操作时它失败了,例如:
https://[REGION]-[PROJECT_ID].cloudfunctions.net/getData?path=/path/to/data&limit=10&startAt=5410228243564
如有任何帮助,我们将不胜感激
我不是 JavaScript 专家,但根据 Firebase 文档,这应该可行。
Firebase 实时数据库中的查询包括:
orderByChild
、orderByKey
和 orderByValue
。startAt
、endAt
、equalTo
等方法完成的limitToFirst
或 limitToLast
限制结果节点数量的指令。您的代码缺少
orderBy
指令,这可能就是它不起作用的原因。由于您似乎想按路径下每个节点的值进行排序,因此请调用 orderByValue
:
let query = ref.orderByValue();