一劳永逸地防止 Parse Server 中重复的终极方法

Posted

技术标签:

【中文标题】一劳永逸地防止 Parse Server 中重复的终极方法【英文标题】:The ultimate way to prevent duplication in Parse Server once and for all 【发布时间】:2018-03-18 05:07:04 【问题描述】:

我们现在使用解析服务器面临的最大问题之一是重复。虽然我们已经通过beforeSaveafterSave 方法实现了Parse 云代码来防止此类事件,同时添加了外部中间件以在保存之前检查现有对象,但我们仍然面临着反复出现的重复操作,特别是在并发操作上。

这是我们防止特定类重复的代码:

Parse.Cloud.beforeSave("Category", function(request, response) 
    var newCategory = request.object;
    var name = newCategory.get("name");
    var query = new Parse.Query("Category");
    query.equalTo("name", name);
    query.first(
        success: function(results) 
            if(results) 
                if (!request.object.isNew())  // allow updates
                    response.success();
                 else 
                    response.error(errorCode:400,errorMsg:"Category already exist");
                
             else 
                response.success();
            
        ,
        error: function(error) 
            response.success();
        
    );
);
Parse.Cloud.afterSave("Category", function(request) 
    var query = new Parse.Query("Category");
    query.equalTo("name", request.object.get("name"));
    query.ascending("createdAt");
    query.find(
        success:function(results) 
            if (results && results.length > 1) 
                for(var i = (results.length - 1); i > 0 ; i--) 
                    results[i].destroy();
                
            
            else 
                // No duplicates
            
        ,
        error:function(error) 
        
    );
);

上面的这段代码能够防止一些重复,但大多数仍然可以通过,例如:

防止与 Parse 服务器重复的“终极方法”是什么?

【问题讨论】:

【参考方案1】:

您始终可以在 mongodb 中为文档中应该唯一的字段创建唯一索引。

这样任何与该索引冲突的保存都将被中止

【讨论】:

一个非常有趣的解决方案。我想你是对的,因为无论如何我们都可以访问 MongoDB。 天哪,我真的需要这个。没有这个技巧就不可能有一个严肃的后端。非常感谢!【参考方案2】:

也许你应该用 Promises 写一些东西,比如:

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


    return new Promise((resolve, reject) => 

        var query = new Parse.Query("Category");
        query.equalTo("name", "Dummy");

        return query.first().then(function (results) 

            resolve(); // or reject()
        );
    )

);


Parse.Cloud.beforeSave("Category", async (request) => 

    (...)
    await results = query.first();

    // then your logic here
    response.success();
    response.error( errorCode: 400, errorMsg: "Category already exist" )

)

【讨论】:

【参考方案3】:

这是我的解决方案:

Parse.Cloud.beforeSave( 'ClassName', async ( request ) => 
    const columnName = 'columnName'
    const className = 'ClassName'

    if( request.object.isNew() ) 
        var newCategory = request.object
        var name = newCategory.get( columnName )
        var query = new Parse.Query( className )
        query.equalTo( columnName, name )
    
        const results = await query.count()

        if( results === 0 ) 
            // no response.success needed 
            // https://github.com/parse-community/parse-server/blob/alpha/3.0.0.md
         else 
            throw 'Is not unique'; 
        
    
 )

【讨论】:

以上是关于一劳永逸地防止 Parse Server 中重复的终极方法的主要内容,如果未能解决你的问题,请参考以下文章

parse.com Cloud Code 防止重复错误

从 excel 导入数据时防止 SQL Server 2008 中的行重复

ListView 单元格中的重复数组元素发出 Parse Server

更好地使用 int.Parse 或 Convert.ToInt32 [重复]

配置在 Parse Server Dashboard 上不可见?

如何防止 SQL Server 表中的重复