Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js firebase起点已设置_Node.js_Firebase_Firebase Realtime Database - Fatal编程技术网

Node.js firebase起点已设置

Node.js firebase起点已设置,node.js,firebase,firebase-realtime-database,Node.js,Firebase,Firebase Realtime Database,我在node.js上使用firebase管理和实时数据库 数据看起来像 当我想得到batch=batch-7的数据时,我正在做 let batch=“batch-7”; 设ref=admin.database().ref('qr/'); ref.orderByChild(“批次”).equalTo(批次).on('value',(快照)=> { res.json(Object.assign({},snapshot.val()); 参考关闭(); }); 一切都很好! 但是现在我应该创建分页,也

我在node.js上使用firebase管理和实时数据库 数据看起来像

当我想得到batch=batch-7的数据时,我正在做

let batch=“batch-7”;
设ref=admin.database().ref('qr/');
ref.orderByChild(“批次”).equalTo(批次).on('value',(快照)=>
{
res.json(Object.assign({},snapshot.val());
参考关闭();
});
一切都很好! 但是现在我应该创建分页,也就是说,我应该根据页面接收10个元素的数据。 我使用以下代码:

let page=req.query.page;//数字页
让batch=req.params.batch;//批次名称
设ref=admin.database().ref('qr/');
参考orderByChild(“批次”).startAt(+第10页).限制第一(10).相等(批次)
.on('值',(快照)=>
{
res.json(Object.assign({},snapshot.val());
参考关闭();
});
但我有一个错误:

Query.equalTo:已设置起点(通过另一次调用startAt或equalTo)


如何从位置M开始获取N的数据,其中批次等于我的批次

您只能调用一个
startAt
(和/或
endAt
equalTo
。两者都打电话是不可能的,也没有多大意义

不过,在传递偏移量时,您似乎对
startAt
的工作原理有一个普遍的误解。Firebase查询不是基于偏移量的,而是只处理值,通常也称为锚节点

因此,当您想要获取第二页的数据,并按
batch
排序时,需要为锚节点传入
batch
的值;要返回的第一个项目。该锚节点通常是上一页的最后一项,因为您还不知道下一页的第一项。对于这个锚节点,您需要知道您订购的商品的值(
batch
通常还需要知道它的键(如果/当有多个节点的
batch
值相同时)

这还意味着您通常会请求比需要多的一个项目,即锚节点

因此,当您请求第一个页面时,您应该跟踪最后一个节点的键/

var lastKey, lastValue;
ref.orderByChild("batch").equalTo(batch).limitToFirst(10).on('value', (snapshot) => {
  snapshot.forEach((child) => {
    lastKey = child.key;
    lastValue = child.child('batch').value();
  })
})
然后,当您需要第二页时,可以执行如下查询:

ref.orderByChild("batch").start(lastValue, lastKey).endAt(lastValue+"\uf8ff").limitToFirst(11).on('value', (snapshot) => {
  snapshot.forEach((child) => {
    lastKey = child.key;
    lastValue = child.child('batch').value();
  })
})
这里还有一个技巧:我使用
startAt
而不是
equalTo
,这样我们就可以进行分页了。但是它随后使用
endAt
来确保我们仍然以正确的项目结束,方法是使用最后一个已知的Unicode字符作为要返回的最后一个
batch

我还强烈建议你看看之前的一些文章