使用AngularFire& amp;从后端检索一个用户的信息。 Firebase查询

时间:2014-09-05 13:01:18

标签: firebase angularfire

我有一个Firebase网址 - http://whatever.firebaseio.com/,我想存储用户名锁定的用户:

users
|
-- username1
   |
   --username: 'username1',
   --realname: 'John Doe',
   --age: 30
--username2
   |
   --username: 'username2',
   --realname: 'Jane Doe',
   --age: 29

我从AngularJS服务中插入数据 - 类似于:

var ref = new Firebase(FIREBASEURL + '/users');
var users = $firebase(ref).$asObject();

users[username] = {
  username: username,
  realname: realname,
  age: age,
  $priority: authUser.uid
};

users.$save(username).then(function() {
  console.log("user saved");
});

(authUser.uid在我的情况下会像' simplelogin:12'因为我正在使用简单登录策略)

这很好用。但是,我所挣扎的是从后端检索一个用户的信息:

var query = $firebase(ref.startAt(authUser.uid).endAt(authUser.uid)).$asObject();
query.$loaded().then(function(snap) {
  console.log(snap.$id); // returns 'users'? why?
  console.log(snap.$value); //returns null
  // I would like to retrurn an object that contains the user information, for example:
  // Object {username: 'username1', realname: 'John Doe', age: 30}
});

我错过了什么/做错了什么?

更新

是的,所以我修改了我的数据结构和查询 - 用于测试目的

users[authUser.uid] = { // note I am keying off from the uid now
  username: username,
  realname: realname,
  age: age,
  $priority: authUser.uid
};

// and this works like a charm (notice limit(1)
var query = $firebase(ref.limit(1)).$asObject();
query.$loaded().then(function() {
  console.log(query[authUser.uid]);
});

然而,这仍然无效:

var query = $firebase(ref.startAt(authUser.uid).endAt(authUser.uid)).$asObject();
query.$loaded().then(function() {
  console.log(query[authUser.uid]); //returns undefined
});

第二次更新

这不会设置优先级:

var ref = new Firebase(FIREBASEURL + '/users');
var users = $firebase(ref).$asObject();

    users[username] = {
      username: username,
      realname: realname,
      age: age,
      $priority: authUser.uid
    };

    users.$save(username).then(function() {
      console.log("user saved");
    });

然而,这正确地设置了优先级:

    ref.child(username).setWithPriority({
              username: username,
              realname: realname,
              age: age,
   }, authUser.uid, function() {
       console.log(users);
   });

更新3

这现在有效:

var users = $firebase(ref).$asArray();

    var User = {
        create: function(authUser, username) {
            users.$add({
                username: username,
                age: age
                $priority: authUser.uid
            }).then(function() {
                console.log(users);
            });

然而,这会添加一个FB生成的id作为密钥。怎么能加我的钥匙? users[username].$add(...)出错了。

更新4

根据评论和其他SO question的代码示例,这就是我提出的:

尝试1:

var ref = new Firebase(FIREBASEURL + '/users');
var users = $firebase(ref).$asArray();
users.push({username: username, age: age, $priority: authUser.uid});
            users.$save(username).then(function(){
                console.log('saved');
            }, function(error) {
                console.log(error); //returns: Invalid record; could determine its key: joe 
            });

尝试2 - 将FixedKeysFactory添加到项目

users[username] = {
  username: username,
  age: age,
  $priority: authUser.uid
};
users.$save(username).then(function() {
  console.log("saved?!"); 
}, function(error) {
  console.log(error); //returns: Invalid record; could determine its key: joe
);

无效记录消息错误消失:(

更新5

因为我想关闭用户名,我不得不修改加藤的原始代码:

app.factory(#39&; FixedKeysFactory&#39 ;,     function($ FirebaseArray,$ firebaseUtils){       return $ FirebaseArray。$ extendFactory({         $ add:function(data){             this._assertNotDestroyed(' $添加');             if(angular.isObject(data)&& typeof data.username ===' string'){// note data.username                 返回此。$ inst()。$ set(data.username,$ firebaseUtils.toJSON(data)); //注意data.username             }             其他{                 返回此。$ inst()。$ push($ firebaseUtils.toJSON(data));             }         }     }); });

这是一个很好的旅程....感谢您的帮助

1 个答案:

答案 0 :(得分:0)

存储用户记录时,请设置priority

var users = $firebase(ref).$asArray();

var User = {
    create: function(authUser, username) {
        users.$add({
            username: username,
            age: age,
            uid: authUser.uid,
            $priority: username
        }).then(function() {
            console.log(users);
        });

然后,您可以使用startAtendAt根据该优先级调用特定的用户记录:

var query = $firebase(ref.startAt(username).endAt(username)).$asObject();
query.$loaded().then(function() {
  console.log(query[username]);
});

//Note: This is pretty much the same code from your original question

或者,您可以考虑使用uid作为优先级。将新登录的用户与现有记录进行匹配是一种更安全的方法:

var users = $firebase(ref).$asArray();
var User = {
    create: function(authUser, username) {
        users.$add({
            username: username,
            age: age,
            uid: authUser.uid,
            $priority: authUser.uid
        }).then(function() {
            console.log(users);
        });

您可以使用原始问题的请求回忆起来:

var query = $firebase(ref.startAt(authUser.uid).endAt(authUser.uid)).$asObject();
query.$loaded().then(function() {
  console.log(query[username]);
});
相关问题