向 Parse Data 上的列添加约束

Adding contraints to a column on 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");
        }
    });
});

所以这是在 Cloud Code 中发生的,对吗? (我假设这是 Javascript)

你可以做的是创建一个在每个 "Event" 对象被保存之前发生的函数和 运行 一个查询以确保事件是唯一的(查询基于 "eventId" 键,而不是 objectId,因为该 ID 来自 Facebook)。如果事件是唯一的,return response.success(),否则return response.error("Event not unique")

例如:

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

这也可以在通过查询调用保存之前完成,并且仅当查询 returns 的数字 == 0 时才保存。

Summary: For those joining later, what we are doing here is checking to see if an object is unique (this time based on key eventId, but we could use any key) by overriding Parse's beforeSave function. This does mean that when we save our objects (for the first time) we need to be extra sure we have logic to handle the error that the object is not unique. Otherwise this could break the user experience (you should have error handling that doesn't break the user experience anyway though).