在Parse Data上向列添加约束

时间:2015-01-02 18:30:50

标签: parse-platform

我将一些对象保存到Parse Data上的表中。但我需要添加约束或确保我尝试插入的数据是唯一的。我正在使用类似下面的代码。但我想保证eventId(我从facebook API获得)在我的表中是唯一的,所以我没有任何冗余信息。使它工作的最佳方法是什么?

var Event = Parse.Object.extend("Event");
var event = new Event();
event.set("eventId", id);
event.set("eventName", name);

event.save(null, {
  success: function(event) {
     console.log('New object created with objectId: ' + event.eventId);
  },
  error: function(event, error) {
     console.log('Failed to create new object, with error code: ' + error.message);
  }
});

更新

我在httpRequest中调用它。以下几乎是我所拥有的,我无法弄清楚如何在其中调用beforeSave。

Parse.Cloud.define("hello", function(request, response) {

    var query = new Parse.Query("Location");
    query.find({
        success: function(results) {
            console.log(results);
        var totalResults = results.length;
        var completedResults = 0;
        var completion = function() {
          response.success("Finished");
        };

            for (var i = 0; i < totalResults; ++i){

            locationId = results[i].get("locationFbId");

            Parse.Cloud.httpRequest({
              url: 'https://graph.facebook.com/v2.2/'+locationId+'/events?access_token='+accessToken,
              success: function(httpResponse) {
                console.log(httpResponse.data);

                console.log("dsa"+locationId);
                for (var key in httpResponse.data) {
                  var obj = httpResponse.data[key];
                  for (var prop in obj) {
                    var eventObj = obj[prop];
                    if (typeof(eventObj) === 'object' && eventObj.hasOwnProperty("id")) {
                      var FbEvent = Parse.Object.extend("FbEvent");
                      var fbEvent = new FbEvent();
                      fbEvent.set("startDate",eventObj["start_time"]);
                      fbEvent.set("locationFbId", locationId);
                      fbEvent.set("fbEventId", eventObj["id"]);
                      fbEvent.set("fbEventName", eventObj["name"]);

                      Parse.Cloud.beforeSave("FbEvent", function(request, response) { 
                        var query = new Parse.Query("FbEvent");
                        query.equalTo("fbEventId", request.params.fbEventId);
                        query.count({
                          success: function(number) {
                            if(number>0){
                              response.error("Event not unique");
                            } else {
                              response.success();
                            }
                          },
                          error: function(error) {
                            response.error(error);
                          }
                        });   
                      });                 
                    }
                  }
                }

                completedResults++;
                if (completedResults == totalResults) {
                  completion();
                }
              },
              error:function(httpResponse){
                completedResults++;
                if (completedResults == totalResults)
                  response.error("Failed to login");
              }
            });
        }
        },
        error: function() {
            response.error("Failed on getting locationId");
        }
    });
});

1 个答案:

答案 0 :(得分:2)

所以这在Cloud Code中发生了吗? (我假设因为这是Javascript)

你可以做的是创建一个在每个&#34;事件&#34;之前发生的功能。保存对象并运行查询以确保事件是唯一的(基于&#34; eventId&#34; key,而不是objectId的查询,因为id来自Facebook)。如果事件是唯一的,则返回response.success(),否则返回response.error(&#34;事件不唯一&#34;)

EX:

Parse.Cloud.beforeSave("Event", function(request, response) {
                if(request.object.dirty("eventId")){ 
                    var query = var new Parse.Query("Event");
                    query.equalTo("eventId", request.object.eventId);
                    query.count({
                        success: function(number) {
                            if(number>0){
                                response.error("Event not unique");
                            } else {
                                response.success();
                            }
                        },
                        error: function(error) {
                            response.error(error);
                        }
                    });  
                } else {
                    response.success();
                } 
});  
Parse.Cloud.define("hello", function(request, response) {
    var query = new Parse.Query("Location");
    query.find({
        success: function(results) {
            console.log(results);
        var totalResults = results.length;
        var completedResults = 0;
        var completion = function() {
          response.success("Finished");
        };
            for (var i = 0; i < totalResults; ++i){
            locationId = results[i].get("locationFbId");
            Parse.Cloud.httpRequest({
              url: 'https://graph.facebook.com/v2.2/'+locationId+'/events?access_token='+accessToken,
              success: function(httpResponse) {
                console.log(httpResponse.data);
                console.log("dsa"+locationId);
                for (var key in httpResponse.data) {
                  var obj = httpResponse.data[key];
                  for (var prop in obj) {
                    var eventObj = obj[prop];
                    if (typeof(eventObj) === 'object' && eventObj.hasOwnProperty("id")) {
                      var FbEvent = Parse.Object.extend("FbEvent");
                      var fbEvent = new FbEvent();
                      fbEvent.set("startDate",eventObj["start_time"]);
                      fbEvent.set("locationFbId", locationId);
                      fbEvent.set("fbEventId", eventObj["id"]);
                      fbEvent.set("fbEventName", eventObj["name"]);
                      // Our beforeSave function is automatically called here when we save it (this will happen every time we save, so we could even upgrade our method as shown in its definition above)
                      fbEvent.save(null, {
                          success: function(event) {
                               console.log('New object created with objectId: ' + event.eventId);
                          },
                          error: function(event, error) {
                              console.log('Failed to create new object, with error code: ' + error.message);
                          }            
                      });                 
                    }
                  }
                }
                completedResults++;
                if (completedResults == totalResults) {
                  completion();
                }
              },
              error:function(httpResponse){
                completedResults++;
                if (completedResults == totalResults)
                  response.error("Failed to login");
              }
            });
        }
        },
        error: function() {
            response.error("Failed on getting locationId");
        }
    });
});

这也可以在通过查询调用保存之前完成,并且只有在查询返回数字== 0时才保存。

  

摘要:对于稍后加入的人,我们在这里做的是检查对象是否是唯一的(这次基于关键eventId,但我们可以使用任何键)通过覆盖 Parse的前保存功能。这确实意味着当我们保存对象时(第一次)我们需要更加确定我们有逻辑来处理对象不唯一的错误。否则,这可能会破坏用户体验(尽管如此,您应该进行错误处理并不会破坏用户体验。)