【发布时间】: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