【问题标题】:Parse cloud code beforeSave fail to ensure records are unique解析云代码 beforeSave 无法确保记录唯一
【发布时间】:2020-07-30 07:20:13
【问题描述】:
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.js parse-platform parse-cloud-code


    【解决方案1】:

    我会为“出席”集合添加一个唯一索引。

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

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

    【讨论】:

      【解决方案2】:

      好吧,您不应该手动编写解析对象进行比较。试试这个方法:

      Parse.Cloud.beforeSave("Attendance", function (request, response) {
          var Attendance = Parse.Object.extend("Attendance");
          var query = new Parse.Query(Attendance);
          query.equalTo('user', request.object.get("user"));
          query.equalTo('meeting', request.object.get("meeting"));
          query.first({ useMasterKey: true }).then(function (result) {
              if (!result) {
                  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;
          });
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-23
        • 1970-01-01
        相关资源
        最近更新 更多