2017-04-30 224 views
0

我正在爲我的IOS應用程序開發一段雲代碼(Parse),並注意到每當我嘗試保存更新的對象時它都無法工作。如果我刪除保存功能,代碼工作,並打印出的成功響應,但如果我把它放在我的錯誤:解析雲代碼保存不執行。

Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

我已經試過了一堆的解決方案也不管它們是什麼,如果保存功能在代碼中,上面的錯誤信息仍然從X-Code調試器打印出來。 (如果沒有,那麼它打印成功響應)

這是代碼:

Parse.Cloud.define("removeFriend", function(request, response) { 
Parse.Cloud.useMasterKey(); 
var userObjId = request.params.userObjId; 
var currentUser = request.params.currentUser; 
var query = new Parse.Query(Parse.User); 
query.equalTo("objectId", userObjId); 
//query.include('Friends'); 
query.find({ 
    success: function(results){ 
     var friendsArray = (results[0].get("Friends")); 
     var newFriends = friendsArray.filter(function(x) {return x != currentUser}); 

     results[0].set("Friends", newFriends); 
     results[0].save(); 
     response.success("THIS IS RESULT" + results[0].get("Friends")); 



    }, 
    error: function(){ 
     response.error("The user was not successfully removed."); 

    } 
}); 

}); 

(我創建了一個類似的問題,用同樣的錯誤較早但自那時以來已重做的代碼,所以我不想將兩個問題混合起來。)

回答

1

保存是異步的,意味着它們發生在單獨的線程中。您在調用save()後立即返回response.success(),因此保存在函數終止之前永不完成。

您有兩種選擇:將成功/錯誤選項添加到save()調用或使用承諾。我更喜歡後者,當你掌握它們的時候,它可以實現更清晰的代碼。

results[0].save().then(
    function(success) { 
     response.success("THIS IS RESULT" + results[0].get("Friends")); 
    }, 
    function(error) { 
     response.error("There was an error trying to save the object: " + JSON.stringify(error)); 
    } 
); 
+0

謝謝,這解決了這個問題,並幫助我理解究竟是什麼導致了問題的原因。 – Gabe

+0

沒問題。我忽略了一個重要部分 - 異步/運行在單獨的線程本身並不是問題,但在另一個線程上運行的函數是一個服務器調用,需要花費時間來完成。您的服務器幾乎立即會響應該響應,因此沒有時間完成異步操作。您將遇到與http請求,提取,查詢,銷燬和調用其他雲功能相同的問題。 –

+1

Parse.Cloud.useMasterKey();已在Parse Server版本2.3.0(2016年12月7日)中棄用。從那個版本開始,它是一個無操作(它什麼都不做)。您現在應該將{useMasterKey:true}可選參數插入到需要在代碼中重寫ACL或CLP的每個方法中。 – alvaro