首页 > 解决方案 > 解析云代码 beforeSave 无法确保记录唯一

问题描述

Parse.Cloud.beforeSave("Attendance", function (request, response) {
    var Attendance = Parse.Object.extend("Attendance");
    var query = new Parse.Query(Attendance);
    query.equalTo('user', { "__type": "Pointer", "className": "_User", "objectId": request.object.get("user").id });
    query.equalTo('meeting', { "__type": "Pointer", "className": "Meeting", "objectId": request.object.get("meeting").id });
    query.first({ useMasterKey: true }).then(function (result) {
        if (result == undefined) {
            console.log("!!!!!!!!! attendance creation approved for user id " + request.object.get("user").id + " and meeting id " + request.object.get("meeting").id)
            response.success();
        } else {
            response.error("Attendance creation prevented because same attendance with same owner and meeting already exists")
        }
    }, function (err) {
        console.error(err);
        response.error(err);
        return;
    });
});

我有一个包含两列的出勤类:用户指针和会议指针。每个用户在一次会议中应该只有一个出席记录。因此,在 beforeSave 云代码触发器中,我进行了查询以查看是否存在现有的出勤记录。我认为这将防止重复的出勤记录。

但是当我们模拟大量并发请求时,例如在一个for循环中创建50个重复的考勤记录,我们仍然会看到大量的重复记录,比如33个重复记录。

这感觉像是一种竞赛条件。

我们如何才能真正防止这样的重复对象?

标签: node.jsparse-platformparse-cloud-code

解决方案


我会在“出勤”集合中添加一个唯一索引。

db.collection.createIndex({'_p_user':1,'_p_meeting':1}, { unique: true } )

这样 mongo 处理唯一性并且不需要查询(将抛出错误 137)。


推荐阅读