一劳永逸地防止 Parse Server 中重复的终极方法
Posted
技术标签:
【中文标题】一劳永逸地防止 Parse Server 中重复的终极方法【英文标题】:The ultimate way to prevent duplication in Parse Server once and for all 【发布时间】:2018-03-18 05:07:04 【问题描述】:我们现在使用解析服务器面临的最大问题之一是重复。虽然我们已经通过beforeSave
和afterSave
方法实现了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 中重复的终极方法的主要内容,如果未能解决你的问题,请参考以下文章
从 excel 导入数据时防止 SQL Server 2008 中的行重复
ListView 单元格中的重复数组元素发出 Parse Server
更好地使用 int.Parse 或 Convert.ToInt32 [重复]