2016-04-27 2 views
0

Я кодирую отношение дружбы в классе User, которое предназначено для дополнительного класса (называемого Matrix). Целью является предоставление дополнительной информации для каждого друга.Parse: Cloud JS code vs Swift не дает одинаковых результатов

Корпус №1: iOS/Swift обеспечивает ожидаемые результаты.

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!) 
         } 
        }) 
       } 
     }) 
    } 
} 

где dbOwner является CurrentUser и dbPeer является пикап из списка

User ClassMatrix ClassRelation (from User to Matrix)

Дело № 2: Разбираем результаты Облако кода с неожиданными отношениями. Вставляется только одно отношение.

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"); 
    } 
    }); 
}); 

с клиентом вызова, как показано ниже:

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)

оценил любую помощь.

ответ

0

Я решил проблему, не нажимая «req.user» для каждого запроса.

Рассмотрение журналов сервера показывает, что только первый запрос добавляет отношение, а второй вызов несет «req.user» с нулевым значением.

'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" 
    } 
} 

Таким образом, я изменил свою функцию API с 2-мя параметрами, «fromId» и «toId», которые запрошены в любой вызов.

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>>>"); 
     } 
    }); 
}); 

Соответственно изменяется вызов функции клиента.

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!) 
       } 
      } 
}