2015-01-02 37 views
0

我將一些對象保存到我的解析數據中的表上。但我需要添加一個約束或確保我試圖插入的數據是唯一的。我正在使用類似下面的代碼。但我想保證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"); 
     } 
    }); 
}); 
+0

http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript只是根/使用GUID返回節約。 –

+0

Srry,我沒有得到,我認爲我不清楚我的問題。該id由Facebook API提供。所以我不生成這個ID。 – adolfosrs

回答

2

所以這是雲代碼正確嗎? (我假設這是Javascript)

你可以做的是創建一個函數,在每個「事件」對象被保存並運行查詢以確保該事件是唯一的(基於「eventId」鍵,而不是objectId,因爲ID來自Facebook)。如果事件是獨特的,返回response.success(),否則返回response.error(「事件不是唯一的」)

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

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).

+0

是的。這是一個替代方案。但我想要更多表現友善的東西。 :/ – adolfosrs

+0

另外。它會在返回response.success之後保存數據嗎?或者我是否需要撥打我的event.save兩種方式? – adolfosrs

+0

我在實例化Event對象後調用它。這是返回這個奇怪的事情「錯誤:beforeSave for FbEvent已被註冊」。 :/ 任何想法? – adolfosrs