防止重复对象,但允许使用Cloud-Code和Parse.com作为后端进行更新

时间:2015-12-28 18:14:05

标签: ios parse-platform cloud-code

我遇到了Cloud Code的问题。我的问题解释为:

  1. 我有一个班级“MyClass”
  2. 我只希望在后端保存一个对象,引用特定属性(“myID”)
  3. 如果用户尝试保存此对象,并且没有任何相同的“myID”保存
  4. 如果用户尝试保存此对象并且已经使用相同的“myID”进行了更新,则更新现有对象的字段(“地址”)。
  5. 我尝试使用此代码:

    var MyObject = Parse.Object.extend("MyClass");
        Parse.Cloud.beforeSave("MyClass", function(request, response) {
        if (!request.object.get("myID")) {
            response.error('A MyObject must have a unique myID.');
        } else {
            var query = new Parse.Query(MyClass);
            query.equalTo("myID", request.object.get("myID"));
            query.first({
                success: function(object) {
                    if (object) {
                        object.set('address',request.object.get("address"));
                        object.save().then(function () {
                            response.error('Updated existing MyObject address');
                        },function (error) {
                            response.error("Error: " + error.code + " " + error.message);
                        });
                    } else {
                        response.success();
                    }
                },
                error: function(error) {
                    response.error("Could not validate uniqueness for this MyObject object.");
                }
            });
        }
    });
    

    但这不起作用,在我的Parse.com日志中说:

      

    结果:错误:142错误:124对Cloud Code的递归调用太多

    我知道我可以实现我想要的吗?

2 个答案:

答案 0 :(得分:0)

当存储beforeSave的对象时,会触发MyClass方法。如果此方法检测到搜索的对象已存在,则会修改此对象并尝试存储它。但这会再次触发beforeSave方法,依此类推,无限循环。

您可以在客户端执行此操作:检查对象是否存在。如果没有,请创建它,但如果是,请为其添加一个条目。但是你应该知道你会遇到一个问题:如果有多个客户端同时执行这个代码,他们都可以发现该对象尚不存在,并且将创建多个对象。

我会从一开始就创建这样一个对象,并使用原子操作addUniqueObject:forKey:向数组中添加条目。

答案 1 :(得分:0)

您无需在beforeSave中保存对象 - 当您致电request.object

时,您对response.success()所做的任何更改都将被保存