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

Prevent duplicate objects but allow Update with Cloud-Code and Parse.com as backend

我的云有问题 Code.My 问题解释为:

  1. 我有一个class"MyClass"
  2. 我只想在我的后端保存一个引用特定 属性 ("myID")
  3. 的对象
  4. 如果用户尝试保存此对象,但没有任何相同的对象 "myID" 保存它
  5. 如果用户尝试保存此对象并且已经有一个相同的对象 "myID" 更新现有对象的字段 ("address")。

我尝试使用以下代码:

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 日志中说:

Result: Error: 142 Error: 124 Too many recursive calls into Cloud Code

我知道我能达到我想要的吗?

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

您可以在客户端执行此操作:检查对象是否存在。如果不是,则创建它,如果是,则向其添加一个条目。但是你应该知道你会遇到一个问题:如果超过1个客户端同时执行这段代码,他们可能都会发现该对象还不存在,并且会创建超过1个对象。

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

您不需要在 beforeSave 中保存对象 - 您对 request.object 所做的任何更改都将在您调用 response.success()

时保存