在Firebase中使用字符串作为优先级

Ada*_*dam 4 javascript firebase

我感兴趣地阅读了这里的博客文章,其中描述了如何使查询等效于sqlWHERE email = x

new Firebase("https://examples-sql-queries.firebaseio.com/user")
  .startAt('kato@firebase.com')
  .endAt('kato@firebase.com')
  .once('value', function(snap) {
    console.log('accounts matching email address', snap.val())
  });
Run Code Online (Sandbox Code Playgroud)

我试图复制如下:

root
 |-rewards
    |--JAJoFho0MYBMGNGrCdc
       |-name: "apple"
    |--JAJoFj7KsLSXMdGZ77V
       |-name: "orange"
    |--JAJoFp7HP6Ajq-VuMMx
       |-name: "banana"
Run Code Online (Sandbox Code Playgroud)

每个奖励对象中还有许多其他字段......但我想按名称索引对象,并能够查询所有这些对象以找到与给定名称匹配的对象.博客文章指示我们使用setPriority()来实现这一目标.

我尝试过以下方法:

var ref = new Firebase('https://<example>.firebaseio.com/rewards').push({
  name: 'apple',
  otherKey: 'somevalue',
  ...
});

ref.setPriority('apple');
Run Code Online (Sandbox Code Playgroud)

如果我然后查询firebase,它返回null:

new Firebase('https://<example>.firebaseio.com/rewards')
    .startAt('apple')
    .endAt('apple')
    .once('value', function(snap) {
        console.log('found:', snap.val()); // logs: "found null"
    }); 
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Kat*_*ato 6

看起来你正试图同步运行这些命令.在您申请奖励时,可能还没有任何数据(您的推送操作可能尚未完成).

接下来,您应该使用setWithPriority,它允许您同时推送数据和优先级.

最后但同样重要的是,您没有提到错误.我假设你检查过那些像勤奋的开发者那样.除了JS控制台之外,您还可以记录回调函数的结果(对于您调用的每个方法都有一个,如果出现问题,可能会返回错误).

总而言之,它应该看起来更像这样:

var ref = new Firebase('https://<example>.firebaseio.com/rewards').push();

ref.setWithPriority({
  name: 'apple',
  otherKey: 'somevalue',
  ...
}, 'apple', function(err) {
   if( error ) { console.error(err); }
   else {
      fetchValue();
   }
});

function fetchValue() {
   // wait for the set to complete before fetching data
   new Firebase('https://<example>.firebaseio.com/rewards')
     .startAt('apple')
     .endAt('apple')
     .once('value', function(snap) {
        console.log('found:', snap.val()); // logs: "found null"
     }); 
}
Run Code Online (Sandbox Code Playgroud)