2016-04-27 4 views
0

Ich bin eine Freundschaft Beziehung in der Klasse Benutzer, die eine zusätzliche Klasse (namens Matrix) zielt kodieren. Das Ziel ist es, zusätzliche Informationen für jeden Freund bereitzustellen.Parse: Cloud-JS-Code vs Swift führt nicht zu den gleichen Ergebnissen

Fall # 1: iOS/Swift liefert die erwarteten Ergebnisse.

func saveRelation(user: User, state: Bool) { 
    if let dbOwner = self.dbUser, dbPeer = user.dbUser { 
     let dbMatrix = PFObject(className: "Matrix") 

      dbMatrix["userid"] = dbPeer 
      dbMatrix.saveInBackgroundWithBlock({ (success: Bool, error: NSError?) -> Void in 
       if(error == nil) && (success == true) { 

        let relation = dbOwner.relationForKey("friend") 
         relation.addObject(dbMatrix) 

        dbOwner.saveInBackgroundWithBlock({ (success: Bool, error: NSError?) -> Void in 
         if(error == nil) && (success == true) { 
          self.directory.friend.append(user) 

          Trace.log("Relation \(user.account.id)", message: "friend") 
         } else { 
           ParseError.handle(error!) 
         } 
        }) 
       } 
     }) 
    } 
} 

wo dbowner Current und dbPeer ist Pickup aus einer Liste

User ClassMatrix ClassRelation (from User to Matrix)

Fall # 2: Cloud-Code Ergebnisse mit unerwarteten Beziehungen analysieren. Es wird nur eine Beziehung eingefügt.

var UserGet = function(id, res) { 
var query = new Parse.Query(Parse.User); 
    query.get(id, { 
    success: function(dbUser) { res.success(dbUser); }, 
    error: function(error) { res.error(error); } 
    }); 
} 

Parse.Cloud.define('Relation.friend', function(req, res) { 
    Parse.Cloud.useMasterKey(); 
    var owner = req.user; 
    var query = UserGet(req.params.peerId, { 
    success: function(dbPeer) { 
     var Matrix = Parse.Object.extend("Matrix"); 
     var matrix = new Matrix(); 

     matrix.set("userId", dbPeer); 
     matrix.save(null, { 
      success: function(dbMatrix) { 
        var relation = owner.relation("friend"); 
         relation.add(dbMatrix); 

        owner.save(null, { 
         success: res.success(true), 
         error: res.error("Update.failed") }); 
       }, 
      error: function(_error) { 
       res.error("Save.failed"); 
       } 
     }); 
    }, 
    error: function(_error) { 
     res.error("Query.failed"); 
    } 
    }); 
}); 

mit dem Kunden Aufruf als Gebrüll:

func saveRelation(user: User, state: Bool) { 
     PFCloud.callFunctionInBackground("Relation.friend", 
      withParameters: [ "peerId" : user.account.id 
          ]) 
      { (success: AnyObject?, error: NSError?) -> Void in 
       if(error == nil) && (success as? Bool == true) { 
        self.directory.friend.append(user) 

        Trace.log("Relation \(user.account.id)", message: "friend") 
       } 
      } 
    } 

Matrix Class (case #2)Relation (case #1)

Jede Hilfe sehr geschätzt.

Antwort

0

Ich habe mein Problem gelöst, ohne zu stoßen 'req.user' ist für jede Anfrage festgelegt.

Serverprotokolle zeigen, dass nur die erste Anforderung eine Beziehung hinzufügt, während ein zweiter Aufruf einen 'req.user' mit einem Nullwert enthält.

'content-length': '326', 
connection: 'close' } { 
"friend": { 
    "__op": "AddRelation", 
    "objects": [ 
    { 
     "__type": "Pointer", 
     "className": "_User", 
     "objectId": "kdja9IlKgm" 
    } 
    ] 
} 
} 

'content-length': '217', 
connection: 'close' } {} 
verbose: { 
    "response": { 
    "updatedAt": "2016-04-28T05:25:00.282Z" 
    } 
} 

So habe ich meine Funktion API mit 2 Parametern verändert ‚AbsenderID‘ und ‚EmpfängerID‘, die jeden Anruf abgefragt werden.

Parse.Cloud.define('Relation.friend', function(req, res) { 
Parse.Cloud.useMasterKey(); 
var queryTo = UserGet(req.params.toId, { 
    success: function(dbTo) { 
    var queryFrom = UserGet(req.params.fromId, { 
     success: function(dbFrom) { 

     var Matrix = Parse.Object.extend("Matrix"); 
     var matrix = new Matrix(); 
      matrix.set("userId", dbTo); 
      matrix.save(null, { 
      success: function(dbMatrix) { 

       var relation = dbFrom.relation("friend"); 
        relation.add(dbMatrix); 

       dbFrom.save(null, { 
        success: function() { 
         console.log("<<<Update.Success>>>"); 
         res.success(true); 
         }, 
        error: function(_error) { 
         console.log("<<<Update.failed>>>"); 
         res.error("Update.failed"); 
         } 
       }); 
      }, 
      error: function(_error) { 
       console.log("<<<Save.failed>>>"); 
       res.error("Save.failed"); 
       } 
      }); 
     }, 
     error: function(_error) { 
      res.error("<<<QueryFrom.failed>>>"); 
      } 
     }); 
    }, 
    error: function(_error) { 
     res.error("<<<QueryTo.failed>>>"); 
     } 
    }); 
}); 

Clientfunktionsaufruf wird entsprechend geändert.

func saveRelation(user: User, state: Bool) { 
     PFCloud.callFunctionInBackground("Relation.friend", 
      withParameters: [ 
           "fromId": owner.account.id, 
           "toId" : user.account.id 
          ]) 
      { (success: AnyObject?, error: NSError?) -> Void in 
       if(error == nil) && (success as? Bool == true) { 
        self.directory.friend.append(user) 

        Trace.log("Relation \(owner.account.id) & \(user.account.id)", message: "friend") 
       } else { 
        ParseError.handle(error!) 
       } 
      } 
} 
Verwandte Themen