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