我有一个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)); } } }); });
这是一个很好的旅程....感谢您的帮助
答案 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);
});
然后,您可以使用startAt
和endAt
根据该优先级调用特定的用户记录:
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]);
});