好的,我正在与AngularJS和Firebase合作并尝试在两个用户之间创建一个简单的交换。现在我的数据结构设置在" users / uId /"然后他们的电子邮件,他们加入的日期和黄金。
在黄金(用户/用户/黄金)下,我已经发送了#34;它捕获金额,时间和对象(电子邮件)。这是下面的代码片段。它还更新了他们的总黄金。
现在我无法更新他们发送黄金的人。我捕获了电子邮件地址,但范围内的所有内容都与当前登录的用户有关。我如何更新新用户/ uId / gold / received的金额,时间和电子邮件来源,以及更新他们的总金额?
我觉得我可能会以错误的方式解决这个问题,感谢任何帮助,谢谢!
ledger.controller('TransferController', function (
$scope, $firebase, $routeParams, $location, $rootScope, FIREBASE_URL) {
$scope.whichuser = $routeParams.uId;
$scope.goldsends = goldsendList;
var ref = new Firebase(FIREBASE_URL + '/users/' + $scope.whichuser + '/gold/' + '/sent/');
var hopperRef = new Firebase(FIREBASE_URL + '/users/' + $scope.whichuser + '/gold/');
var usersRef = ref.child("users");
var goldsendList = $firebase(ref).$asArray();
$scope.sendGold = function () {
var sendgoldObj = $firebase(ref); //this var has to match the sendgoldObj.$push var down below, and that's it
var myData = {
amount: $scope.user.amount,
email: $scope.user.email,
date: Firebase.ServerValue.TIMESTAMP
};
sendgoldObj.$push(myData).then(function () {
// $location.path('/myledger/'); //page redirect
}); //data sent to firebase.
if ($scope.currentUser.gold.total - Math.abs($scope.user.amount) > 0) { //
var hopperRefff = hopperRef.child("gold");
hopperRef.update({
"total": $scope.currentUser.gold.total - $scope.user.amount
}); //update total gold
var receive = new Firebase(FIREBASE_URL);
ref.child('users').orderByChild('email').equalTo(emailAddress).once('value', function (snap) {
console.log(snap.name() + (snap.val() === null ? ' DOES NOT' : ' does') + ' exist');
}); //trying to find user to send gold to
} //if user has enough gold statement
else {
return {
scope: {
errormessage: 'You don\'t have enough money',
}
};
console.log("not enough money!");
} //else note enough gold statement
} //sendgold
}); //TransferController
答案 0 :(得分:1)
您可以通过电子邮件存储用户,@
替换为_
,.
替换为-
所以你在Firebase中有这样的JSON结构
users: {
"bob_hoskins-com": {
email: "bob@hoskins.com",
date: "09-09-1999",
gold: {
...
}
}
}
但是,我不认为这是解决这个问题的好方法。
我会创建一个节点服务,在每个用户上观察requests
Firebase位置以添加子节点。然后,节点服务将执行计算并将数据写入正确的路径,然后可以在处理后删除请求。
所以你会像你这样在你的Firebase上制定规则
{
"rules": {
"$userId": {
"requests": {
".read": "auth != null && $userId == auth.id",
".write": "auth != null && $userId == auth.id"
},
"responses": {
".read": "auth != null && $userId == auth.id",
".write": "auth != null && $userId == auth.id"
}
}
}
这是一些请求代码
var Firebase = require('firebase');
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
function guid() {
return s4() + s4() + s4() + s4();
}
var _ref = new Firebase('https://YOUR_FIREBASE.firebaseio.com/');
//Log me in
var guid = guid();
var FirebaseTokenGenerator = require("firebase-token-generator");
var tokenGenerator = new FirebaseTokenGenerator("YOUR_TOKEN");
var TOKEN = tokenGenerator.createToken({uid: guid, user: "node server"},{admin: true});
_ref.authWithCustomToken(TOKEN, function (error) {
if(error) {
console.log("Login Failed!", error);
} else {
console.log("Login Succeeded!", guid);
}
});
_ref.on('child_added', function (user) {
var requests = user.ref().child('requests');
requests.on('child_added', function(req) {
handleRequest(req);
});
});
var handleRequest = function (request) {
// Process the request
// Write stuff back to Firebase
// Delete the request
request.ref().remove();
};
答案 1 :(得分:0)
为用户设置值只是检查该用户是否存在的变体。获得快照后,您可以致电ref
ref.child('users').orderByChild('email').equalTo(emailAddress).once('value', function (snap) {
snap.ref().update({ "total": snap.val().total + amount });
});
这不仅仅是一个示例,因此您可能需要根据实际数据结构对其进行更新。
以上内容将为您提供users
节点的值。
您需要在once('child_added'
上捕获forEach
或on('value'
。我将举两个例子。
聆听child_added
:
ref.child('users').orderByChild('email').equalTo(emailAddress).once('child_added', function (snap) {
snap.ref().update({ "total": snap.val().total + amount });
});
循环value
:
ref.child('users').orderByChild('email').equalTo(emailAddress).once('value', function (snap) {
snap.forEach(function(childsnap) {
childsnap.ref().update({ "total": snap.val().total + amount });
});
这里是一个包含两个样本的jsbin:http://jsbin.com/fenavu/1/edit?js,console。请注意,此处的代码会写出ref.toString()
,它会为您提供节点的完整网址(因为Firebase中的每个数据都有自己唯一的URL)。这可以很方便地确定您的节点映射到的URL。