在Parse Cloud Code中调用更新

时间:2015-03-24 14:58:12

标签: javascript parse-platform cloud-code

我知道有类似的问题,但我认为没有解决方法。 如果数据库中不存在,我想创建新对象,如果存在则更新。 这是我的简单代码:

  Parse.Cloud.beforeSave("Tag", function(request, response) {
  var query = new Parse.Query("Tag");
  query.equalTo("name", request.object.get("name"));
  query.first({
    success: function(result) {
        if (!result) {
            response.success();
        } else {
            result.increment("popularityCount");
            result.save();
        }
    },
    error: function(error) {
       alert("Error: " + error.code + " " + error.message);
    }
  });
});

如你所见,我在保存前调用它。如果查询没有找到任何内容,则创建新条目。如果查询找到了某些内容,则应该采用此结果,并popularityCount。但事实并非如此。它仅在我之后调用response.success()时才有效,但调用此函数也会导致创建新条目。

1 个答案:

答案 0 :(得分:1)

在每次保存时增加对象上的计数器似乎是错误的。如果由于其他原因修改了对象怎么办?如果你确实想在每次保存时增加一个字段,则不需要查询 - 保存的对象将传递给该函数。此外,在保存新对象的情况下,查询将无效

相反,如何找到或创建对象作为一个操作,当app逻辑调用它时递增计数器

 function findOrCreateTagNamed(name) {
    var query = new Parse.Query(Tag);
    query.equalTo("name", name);
    return query.first().then(function(tag) {
        // if not found, create one...
        if (!tag) {
            tag = new Tag();
            tag.set("popularityCount", 0);
            tag.set("name", name);
        }
        return (tag.isNew())? tag.save() : Parse.Promise.as(tag);
    });
}

function incrementPopularityOfTagNamed(name) {
    return findOrCreateTagNamed(name).then(function(tag) {
        tag.increment("popularityCount");
        return tag.save();
    });
}

现在不需要beforeSave逻辑(这似乎是正确的做法,而不是解决方法)。

Parse.Cloud.beforeSave("Tag", function(request, response) {
    var tag = request.object;
    tag.increment("popularityCount");
    response.success();
});