Javascript 在保存获取预更新对象之前解析cloudcode

Javascript 在保存获取预更新对象之前解析cloudcode,javascript,parse-platform,Javascript,Parse Platform,在一个beforeSavehook中,我想获得更新之前对象的状态。在这种特殊情况下,它是为了阻止用户在做出选择后改变他们的选择。伪代码类似于: If (user has already voted) { deny; } else { accept; } 到目前为止,我掌握的代码是: Parse.Cloud.beforeSave('votes', function(request, response) { if (!request.object.isNew()) { // T

在一个
beforeSave
hook中,我想获得更新之前对象的状态。在这种特殊情况下,它是为了阻止用户在做出选择后改变他们的选择。伪代码类似于:

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
是已应用更新的对象的状态


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

请求变量是更新的行本身。您可以通过
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);
        }
    });
}

虽然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);
        }
    });
});

您可以使用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();
});
这起到了作用:

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);
        });

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

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

谢谢我希望他们能自动给你之前的对象,但这会很好。对于那些找到这个响应的人来说,有一个小提示:上面回答的第6行
row.object.get('choice')
应该是
row.get('choice')
dirtyfield包含每个有新值或更新值的字段。对于新对象,所有字段都是脏的。但您不需要使用dirtykey来检查新对象。您只需执行if(request.object.existed())检查以确定其是否为新对象。您还可以使用“request.object.isNew()”检查对象是否为新对象。请注意,在中使用
的示例代码是错误的。它必须是'for of'(const dirtyKey of request.object.dirtyKeys()){//这将正确地给出keys hi@MobileVet。我也有类似的问题。但在我的情况下,我需要获取旧对象和新对象并比较其值,然后保存(或不保存)。问题是我只能取新的或旧的。请看我的问题:tks