【问题标题】:Parse - Check for Update inside BeforeSave in Cloud CodeParse - 在 Cloud Code 中检查 BeforeSave 中的更新
【发布时间】:2014-01-30 09:31:19
【问题描述】:

我想检查我是否没有为活动的参加状态保存重复条目 - 所以在 BeforeSave 中我正在检查活动 rsvp 是否尚未输入 - 如果有,我想知道它是否需要要被更新。如果是这样,我想进行更新而不是创建新的 RSVP 条目。

这是我的代码 - 即使在 BeforeSave 中进行了最简单的更新,我似乎也无法让它工作。

Parse.Cloud.beforeSave("Rsvps", function(request, response) {

var eventid = request.object.get("eventid");
var userid = request.object.get("userid");
var rsvp_status = request.object.get("rsvp_status");

var Rsvps = Parse.Object.extend("Rsvps");
var query = new Parse.Query(Rsvps);
query.equalTo("eventid", eventid);
query.equalTo("userid", userid);
query.first({
  success: function(object) {
    if (object) {
        // response.error("An RSVP for this event already exists.");
        request.object.id = object.id;
        request.object.set('rsvp_status', "attending");
        request.object.save();
    } else {
      response.success();
    }
  },
  error: function(error) {
    response.error("Error: " + error.code + " " + error.message);
  }
});

});

我已经尝试了这么多变种,但没有任何乐趣 - 这是我最近的尝试。

【问题讨论】:

  • 你试过用 Parse.Cloud.define 代替 Parse.Cloud.beforeSave
  • 我最初尝试定义一个函数,但也无法让它工作。
  • 我更新了答案中的代码。我希望它会生成更好的错误消息。它还会将数字打印到 Parse.com 日志中,以便我们可以看到函数在死前的进度。 -aoffer
  • 我添加了一个检查以防止未终止的递归。立即尝试代码。
  • 如果代码对你有用,你会接受我提供的答案吗?

标签: javascript parse-platform


【解决方案1】:

@CityLogic 你不应该在@ahoffer 的例子中调用第二次保存,因为你在 beforeSave 触发器中。只需设置 resp_status 并调用 response.success()。

【讨论】:

    【解决方案2】:

    已更新。如果“参加”值正确,我添加了一个检查以不更新现有对象。试试这个。如果有任何您无法解决,请将错误添加为此答案的注释。

    Parse.Cloud.beforeSave("Rsvps", function (request, response) {
    
        var eventid = request.object.get("eventid");
        var userid = request.object.get("userid");
        var rsvp_status = request.object.get("rsvp_status");
    
        //Do not re-declare the class
        //var Rsvps = Parse.Object.extend("Rsvps");
        var query = new Parse.Query("Rsvps");
    
        //Check for existing RSVP
        query.equalTo("eventid", eventid);
        query.equalTo("userid", userid);
    
        query.first().then(function (object) {
    
                if (object && object.get('rsvp_status') != "attending") {
                    //RSVP exists and needs updating.
                    // Do not save the object attached to the request.
                    //Instead, update existing object.
    
                    object.set('rsvp_status', "attending");
                    object.save().then(function () {
                            response.error('Updated existing RSVP to "attending"');
                        },
    
                        function (error) {
    
                            response.error("Error: " + error.code + " " + error.message);
                        });
    
                } else {
    
                    //Continuing and save the new RSVP object because it is not a duplicate.
                    response.success();
                }
            },
            function (error) {
    
                response.error("Error: " + error.code + " " + error.message);
    
            });
    });
    

    【讨论】:

    • 我收到以下错误:E2014-01-31T15:35:56.065Z] v52:为用户 t6CspxQuhm 的 Rsvps 触发 before_save 输入:{"original":{"eid":XXXX," rsvp_status":"not_replied","start_time":"2014-01-30T20:30:00+0200","uid":XXXXXX,"createdAt":"2014-01-31T15:34:14.985Z","updatedAt ":"2014-01-31T15:34:14.985Z","objectId":"NbTU5L89TV"},"update":{"rsvp_status":"attending"}} 结果:未调用成功/错误
    • 添加一个新的有效,更新一个现有的失败:Error: Error: 142 Error: 142 Error: 142 Error: 142 Error: 124 Too many recursive calls into Cloud Code - 我猜 save() 触发了 beforeSave 等等……我有一些反馈这个来自 Parse.com [parse.com/questions/…],看起来就像你建议的那样,一个定义的函数是要走的路。
    • 我知道这是旧的,但是您可以将该对象传递给响应,而不是对更新的对象调用保存,例如:response.success(object)。这将返回您发现已存在的对象,随后您对其进行了更新。通过将其作为参数传递给响应,更新的对象将被保存。参考:parse.com/docs/js/api/classes/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 2015-10-25
    相关资源
    最近更新 更多