【问题标题】:Parse cloudcode beforeSave obtain pre-updated object解析 cloudcode beforeSave 获取更新前的对象
【发布时间】:2014-08-01 14:16:22
【问题描述】:

beforeSave 挂钩中,我想在更新之前获取对象的状态。在这种特殊情况下,它是阻止用户在做出选择后改变他们的选择。伪代码看起来像:

If (user has already voted) {
  deny;
} else {
  accept;
}

我目前的代码是:

Parse.Cloud.beforeSave('votes', function(request, response) {
  if (!request.object.isNew()) {
    // This is an update.  See if the user already voted
    if (request.object.get('choice') !== null) {
      response.error('Not allowed to change your choice once submitted');
    }
  }
  response.success();
}

request.object 是已应用更新的对象的状态。

请注意,'votes' 对象是单独创建的,因此不允许插入但不允许更新是不够的;我需要知道数据库中是否已经设置了给定字段。

【问题讨论】:

    标签: javascript parse-platform


    【解决方案1】:

    虽然 Krodmannix 的响应是正确的(并且对我很有帮助),但它具有完整查询的开销。如果你在 beforeSave 中做事,你真的很想精简它们。因此,我相信 fetch 命令更可取。

    Parse.Cloud.beforeSave('votes', function(request, response) {
        if (!request.object.isNew()) {
          var Votes = Parse.Object.extend("votes");
          var oldVote = new Votes();
          oldVote.set("objectId",request.object.id);
          oldVote.fetch({
            success: function(oldVote) {
                if (oldVote('choice') !== null) {
                    response.error('Not allowed to change your choice once submitted');
                }
                else {
                    response.success(); // Only after we check for error do we call success
                }
            },
            error: function(oldVote, error) {
                response.error(error.message);
            }
        });
    });
    

    【讨论】:

    • 嗨@MobileVet。我有一个类似的问题。但在我的情况下,我需要获取旧对象和新对象并比较其值,然后保存(或不保存)。问题是我只能获取新的或旧的。看看我的问题:stackoverflow.com/q/32914945/4871489tks
    【解决方案2】:

    如果您使用的是自托管 Parse 服务器,则有一个名为“original”的请求属性,它是更改前的对象。

    Parse.Cloud.beforeSave("Post", function(request, response) {
        console.log(request.object);    //contains changes
        console.log(request.original);  //contains original
        response.success();
    });
    

    【讨论】:

      【解决方案3】:

      您可以使用 Parse DirtyKeys 来识别哪个字段已更改。

         Parse.Cloud.beforeSave(Parse.User, function(request, response) {
        for (dirtyKey in request.object.dirtyKeys()) {
          if (dirtyKey === "yourfieldname") {
            response.error("User is not allowed to modify " + dirtyKey);
            return;
          }
        }
        response.success();
      });
      

      【讨论】:

      • dirtyfield 包含具有新值或更新值的每个字段。如果是新对象,所有字段都是脏的。但是您不需要使用dirtykey 来检查新对象。您可以简单地执行 if(request.object.existed()) 检查以确定它是否是新对象。
      • 您还可以使用“request.object.isNew()”检查对象是否是新的
      • 请注意示例代码在使用for in时是错误的。它必须是` for of` for (const dirtyKey of request.object.dirtyKeys()) { // 这将正确地给出键
      【解决方案4】:

      request 变量是更新后的行本身。您可以通过request.object.id获取它的对象ID,并使用它从数据库中获取当前行并检查当前值,如下所示:

      Parse.Cloud.beforeSave('votes', function(request, response) {
          if (!request.object.isNew()) {
          var query = new Parse.Query("votes");
          query.get(request.object.id, { // Gets row you're trying to update
              success: function(row) {
                  if (row.get('choice') !== null) 
                      response.error('Not allowed to change your choice once submitted');
                  response.success(); // Only after we check for error do we call success
              },
              error: function(row, error) {
                  response.error(error.message);
              }
          });
      }
      

      【讨论】:

      • 谢谢;希望他们自动给您先前的对象,但这会很好。
      • 对于那些发现此响应的人的一个小提示:row.object.get('choice') 上面答案的第 6 行应该只是 row.get('choice')
      【解决方案5】:

      这行得通:

      var dirtyKeys = request.object.dirtyKeys();
      var query = new Parse.Query("Question");
      var clonedData = null;
              query.equalTo("objectId", request.object.id);
              query.find().then(function(data){
                  var clonedPatch = request.object.toJSON();
                  clonedData = data[0];
                  clonedData = clonedData.toJSON();
                  console.log("this is the data : ", clonedData, clonedPatch, dirtyKeys);
                  response.success();
              }).then(null, function(err){
                  console.log("the error is : ", err);
              });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-18
        相关资源
        最近更新 更多