【问题标题】:Parse Cloud Code Save Not Performing.解析云代码保存未执行。
【发布时间】:2017-04-30 22:16:35
【问题描述】:

我正在为我的 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.");   

    }   
});

});

(我之前创建了一个具有相同错误的类似问题,但从那以后我重做了代码,所以我不想把这两个问题混为一谈。)

【问题讨论】:

    标签: javascript json parse-platform


    【解决方案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)); 
        }
    );
    

    【讨论】:

    • 谢谢,这解决了问题,并帮助我首先了解导致问题的真正原因。
    • 没问题。我遗漏的一个重要部分 - 异步/在单独的线程上运行本身不是问题,但在另一个线程上运行的函数是服务器调用,这需要时间才能完成。您的服务器几乎立即命中该响应调用,因此没有时间完成异步操作。对于 http 请求、获取、查询、销毁和调用其他云函数,您也会遇到同样的问题。
    • Parse.Cloud.useMasterKey();已在 Parse Server 版本 2.3.0(2016 年 12 月 7 日)中弃用。从那个版本开始,它是一个无操作(它什么都不做)。您现在应该将 {useMasterKey:true} 可选参数插入到需要在代码中覆盖 ACL 或 CLP 的每个方法中。
    猜你喜欢
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多