解析云代码之前获取预更新的对象

jgm*_*jgm 8 javascript parse-platform

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

If (user has already voted) {
  deny;
} else {
  accept;
}
Run Code Online (Sandbox Code Playgroud)

我到目前为止的代码是:

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();
}
Run Code Online (Sandbox Code Playgroud)

但是request.object已经应用了更新的对象的状态.

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

Mob*_*Vet 15

虽然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);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)


kro*_*nix 9

request变量是更新的行本身.你可以通过它获取它的对象id request.object.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);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)


Abd*_*jid 9

您可以使用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();
});
Run Code Online (Sandbox Code Playgroud)


小智 8

如果您使用的是自托管的Parse Server,则会在请求时显示一个名为"original"的属性,该属性是更改前的对象.

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