使用AngularJS和Firebase在用户之间传递项目

使用AngularJS和Firebase在用户之间传递项目,angularjs,firebase,Angularjs,Firebase,好的,我正在与AngularJS和Firebase合作,试图在两个用户之间创建一个简单的交换。现在,我的数据结构设置在“users/uId/”下,然后是他们的电子邮件、加入日期和gold 在gold(users/uId/gold)下,我有一个“sent”,它捕获了金额、时间和收件人(电子邮件)。这是下面的代码片段。它还更新了他们的黄金总数 现在我被困在更新他们送黄金给的人。我捕获了电子邮件地址,但范围内的所有内容都与当前登录的用户相关。我如何更新新用户/uId/gold/收到的金额、时间和电子邮

好的,我正在与AngularJS和Firebase合作,试图在两个用户之间创建一个简单的交换。现在,我的数据结构设置在“users/uId/”下,然后是他们的电子邮件、加入日期和gold

在gold(users/uId/gold)下,我有一个“sent”,它捕获了金额、时间和收件人(电子邮件)。这是下面的代码片段。它还更新了他们的黄金总数

现在我被困在更新他们送黄金给的人。我捕获了电子邮件地址,但范围内的所有内容都与当前登录的用户相关。我如何更新新用户/uId/gold/收到的金额、时间和电子邮件,以及更新他们的总gold

我觉得我可能走错了方向,任何帮助都将不胜感激,谢谢

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

为用户设置值只是检查该用户是否存在的一种变体。创建快照后,可以通过调用
ref

ref.child('users').orderByChild('email').equalTo(emailAddress).once('value', function (snap) {        
    snap.ref().update({ "total": snap.val().total + amount });
});
并不是说这只是一个示例,所以您可能需要根据实际数据结构对其进行更新

更新 上面将获得
users
节点的值

您需要捕获
一次('child\u added'
forEach
在('value')上的
上。我将给出两者的示例

正在收听添加的儿童节目

ref.child('users').orderByChild('email').equalTo(emailAddress).once('child_added', function (snap) {        
    snap.ref().update({ "total": snap.val().total + amount });

});
值上循环的示例如下:

ref.child('users').orderByChild('email').equalTo(emailAddress).once('value', function (snap) {        
    snap.forEach(function(childsnap) {
        childsnap.ref().update({ "total": snap.val().total + amount });

});

这是一个包含两个示例的jsbin:。请注意,这里的代码写出了
ref.toString()
,这将为您提供节点的完整URL(因为Firebase中的每个数据段都有其唯一的URL)。这是一种计算节点映射到哪个URL的简便方法。

您可以通过电子邮件存储用户,其中
@
替换为
\uu
,而
替换为
-

在Firebase中有这样的JSON结构

users: {
   "bob_hoskins-com": { 
      email: "bob@hoskins.com",
      date: "09-09-1999",
      gold: {
          ...
      }
   }
}
然而,我认为这不是解决这个问题的好方法

我将创建一个节点服务,用于观察每个用户上添加的子节点的
请求
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();
};

您使用
ref.child('users').orderByChild('email').equalTo(emailAddress)的方法是正确的
。那么,该代码片段有什么问题?该代码用于告诉我数据库中是否存在该电子邮件,但我如何将数据推送到该用户?嘿,弗兰克!谢谢,这是正确的,但这并不是指向电子邮件所在的位置,它只是将“gold:total”添加到基本“用户”中,而不是那个特定的用户。我是否缺少一些东西来确保它在那个用户下更新,而不仅仅是一般的“用户”?是的,我想知道。你可能应该使用
一次('child_added'
进入child。但是,既然你显然认为电子邮件地址是识别用户的好方法,为什么不把电子邮件地址也用作用户节点的名称呢?这将使行回到更易于管理的
ref.child('users').child(emailAddress).update(…
。嘿,弗兰克!只要将“value”转换为“child_added”就可以了!(你的第一个例子)。非常感谢!我想如果我只是使用电子邮件作为用户的节点,我仍然会有同样的问题,因为我需要在当前用户以及其他用户下进行更新。感谢您的帮助!我不知道这个答案如何解决问题。您肯定不想授予用户在其他用户的acc上设置总数等的写入权限ount?关于使用基于观察请求的方法,请参阅下面我的答案。您可以在节点脚本中处理任何类型的请求,并作为管理员对目标用户进行相应的更改。问题不是“如何在玩家之间安全转账?”,而是“为什么我的代码找不到其他用户?”,这就是我的回答。如果您关心安全性,这是一个更好的解决方案,不需要托管您自己的服务器: