2017-04-30 4 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コードデバッガから出力されます。保存関数がコード内にある場合。 (そうでなければ、それは成功応答を出力します)

これはコードです:

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

    } 
}); 

}); 

(私は同じエラー以前と同様の質問を作成しましたが、私はしたくなかったので、それ以来、コードを再実行しています2つの質問を混在させる)。

答えて

1

セーブは非同期で、別々のスレッドで実行されます。 save()を呼び出した直後にresponse.success()を返しているので、関数が終了する前に保存が完了することはありません。

あなたには2つのオプションがあります:成功/エラーオプションをsave()コールに追加するか、約束を使用します。私は後者を好む、それはあなたがそれらのハングアップを取得するときにはるかにクリーンなコードを可能にする。

+0

これは問題を解決し、実際に問題の原因を最初に解明するのに役立ちました。 – Gabe

+0

問題ありません。重要な部分は、非同期/独立したスレッド自体で実行することは問題ではありませんが、他のスレッドで実行されている関数はサーバコールであり、処理に時間がかかります。あなたのサーバーはすぐにその応答呼び出しをヒットするので、非同期操作が完了する時間はありません。 httpリクエスト、フェッチ、クエリ、破棄、その他のクラウド機能の呼び出しでも同じ問題が発生します。 –

+1

Parse.Cloud.useMasterKey(); Parse Serverバージョン2.3.0(2016年12月7日)では廃止されました。そのバージョン以降、何もしません。コード内のACLまたはCLPをオーバーライドする必要のある各メソッドに、{useMasterKey:true}オプションのパラメータを挿入する必要があります。 – alvaro

関連する問題