javascript - 解析: Cloud JS code vs Swift does not produce the same results

标签 javascript ios swift parse-server

我正在 User 类中编写一个友谊关系,该关系针对一个补充类(名为 Matrix)。我们的目标是为每个 friend 提供额外的信息。

案例#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 是当前用户,dbPeer 是从列表中选取的

User Class Matrix Class Relation (from User to Matrix)

案例 #2:解析具有意外关系的 Cloud 代码结果。仅插入一个关系。

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)

感谢任何帮助。

最佳答案

我已经解决了我的问题,而没有为每个请求设置“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"
  }
}

因此,我用 2 个参数“fromId”和“toId”更改了我的函数 API,这两个参数在任何调用时都会被查询。

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

关于javascript - 解析: Cloud JS code vs Swift does not produce the same results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36897800/

相关文章:

swift - 尽管为零,但闭包仍被执行

Swift - 无法获取 NSMutableArray() 的元素

javascript - 如何将此 Highchart 系列的线条延伸到我的图表区域的边缘?

javascript - 在所有迭代完成之前调用 node.js async.each() 回调

javascript - 绝对元素在垂直滚动经过它时变得固定

ios - 如何允许用户通过Siri在iOS应用中进行搜索

swift - 如何在 Swift 4.2 的另一个 View Controller 中删除 UICollectionView 中的选定/突出显示的单元格

javascript - 没有插件的 jquery 排序表

ios - 使用 UTC 时间获取 [NSDate 日期]

ios - 更新约束后,按钮未正确定位在自动布局中