【问题标题】:Retrieve one user's information from the backend with an AngularFire & Firebase Query使用 AngularFire 和 Firebase 查询从后端检索一个用户的信息
【发布时间】:2014-09-05 13:01:17
【问题描述】:

我有一个 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 类似于“simpllogin: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

基于 cmets 和来自其他 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('FixedKeysFactory', 功能($FirebaseArray,$firebaseUtils){ 返回 $FirebaseArray.$extendFactory({ $添加:函数(数据){ this._assertNotDestroyed('$add'); if (angular.isObject(data) && typeof data.username === 'string' ) { //注意 data.username 返回 this.$inst().$set(data.username, $firebaseUtils.toJSON(data)); //注意数据.用户名 } 别的 { 返回 this.$inst().$push($firebaseUtils.toJSON(data)); } } }); });

这真是一段旅程......感谢您的所有帮助

【问题讨论】:

  • 来自stackoverflow.com/a/24267098/209103:“传入startAt的第一个参数是优先级,而不是记录键”。您是否确实通过了优先级?
  • 第二:Firebase 查询返回一个集合,即使它是一个只有一个项目的集合。所以我希望看到$asArray(),你现在有$asObject()
  • @FrankvanPuffelen - 我在调用 $save 时设置了 $priority - 这对您来说是否正确?我将 $priority 设置为“authUser.uid”,然后我也使用它来检索数据。
  • @FrankvanPuffelen - 我想问题是,优先级可以像'simplelogin:11'
  • "优先级可以是数字或字符串" (firebase.com/docs/web/api/firebase/setpriority.html)

标签: firebase angularfire


【解决方案1】:

当你存储你的用户记录时,设置一个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]);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多