parse.com Cloud Code 防止重复错误

Posted

技术标签:

【中文标题】parse.com Cloud Code 防止重复错误【英文标题】:parse.com Cloud Code prevent duplication error 【发布时间】:2014-04-06 09:57:44 【问题描述】:

我按照这里的说明进行操作:

https://parse.com/questions/unique-fields--2

var Profile = Parse.Object.extend("Profile");

Parse.Cloud.beforeSave("Profile", function(request, response) 

                       if (!request.object.get("entityID")) 
                            response.error('must have a entity id');
                        else 

                       var query = new Parse.Query(Profile);
                       query.equalTo("entityID", request.object.get("entityID"));
                       query.first(

                                   success:function(object) 

                                    if (object) 
                                        response.error("already exist");
                                    
                                    else 
                                        response.success();
                                    

                                   ,
                                   error:function(error) 
                                        response.error("couldnt validate uniqueness for this profile");
                                   

                        );


                        
                       );

我有一个配置文件表,唯一键是entityID,插入时,我需要检查具有相同键的条目是否已经存在。

问题是,我无法再更新条目(似乎插入和更新请求都会触发此云代码。

我怎样才能修改它,以便

    当我插入时,如果它存在,我会忽略它;如果不存在,则插入它。

    当我更新时,如果存在,更新它;如果不存在,我忽略它。

【问题讨论】:

【参考方案1】:

我知道这有点老了,但应该提到的是,在 Parse 实施锁定/等待系统或任意约束强制执行之前,不可能完全防止使用云代码的重复条目,因为不能保证只有代码的一个实例在任何给定点运行。即使你有这样的东西:

if entry exists
    update it or don't add it
else
    add it

由于没有锁定,您无法实施自己的约束强制。此外,尝试这样做会使您的 API 调用翻倍,并可能使您陷入更昂贵的计划。 Parse 工作人员甚至在最近几个月也多次承认这一点(只需搜索他们的论坛),并建议在某些情况下使用原子增量或自动生成的唯一对象 ID,但在大多数情况下,这并不实用。他们还建议在输入重复项后运行自动作业以删除重复项,但这并不能保证在任何给定点系统中的数据都是内部一致的,即使在作业运行之后也是如此。

如果约束实施和整体数据完整性对您的应用程序至关重要,那么 Parse 还不够成熟,无法满足您的需求。我希望尽快看到这种变化。

【讨论】:

【参考方案2】:

您可以调用自定义云函数来执行您想要的所有操作,而不是使用创建和更新请求。省去了我的一些头痛。

【讨论】:

【参考方案3】:

S.C.是正确的。

在此期间,您可能会变得肮脏并执行以下操作:

Parse.Cloud.afterSave("Profile", function(request) 

    // Find every Profile with same entityID
    var query = new Parse.Query(Profile);
    query.equalTo("entityID", request.object.get("entityID"));

    // Order them by creation in db (oldest in DB first)
    query.ascending("createdAt");

    query.find(

        success:function(results) 

            if (results && results.length > 1) 
                // We have a least one duplicate

                // Destroy every Profile except for the original (the oldest in DB)
                for(var i = (results.length - 1); i > 0 ; i--)   
                    results[i].destroy();
                    // /!\ In case of concurrent call of afterSave, 
                    // we might run in situation of concurrent deletetion 
                    // of same Profile in this case we might encounter (or not?) some 
                    // time out of this function buuut we will always keep 
                    // the same Profile from being deleted.
                
            
            else 
                // No duplicates
            

        ,
        error:function(error) 
        
     );
 );

【讨论】:

以上是关于parse.com Cloud Code 防止重复错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Parse Code Cloud Javascript 函数更改 Parse 列的值

将 Java 字符串数组或 JSON 字符串转换为 Javascript 数组(Parse.com Cloud Code 和 Mandrill)

无法使用 parse.com 云功能 Android 将 Json 对象强制转换为 Float

Spring Cloud Stream 如何防止应用程序的实例接收重复消息?

UITableView 重复单元格如何防止呢?迅速

解析服务器资源限制