Javascript 解析云代码保存未执行。
我正在为我的IOS应用程序编写一段云代码(解析),并注意到每当我试图保存更新的对象时,它都无法工作。如果删除save函数,代码将工作并打印成功响应,但如果保留该函数,则会出现错误:Javascript 解析云代码保存未执行。,javascript,json,parse-platform,Javascript,Json,Parse Platform,我正在为我的IOS应用程序编写一段云代码(解析),并注意到每当我试图保存更新的对象时,它都无法工作。如果删除save函数,代码将工作并打印成功响应,但如果保留该函数,则会出现错误: Error Domain=NSCocoaErrorDomain code=3840“JSON文本未以数组或对象开头,允许未设置片段的选项。”UserInfo={NSDebugDescription=JSON文本未以数组或对象开头,允许未设置片段的选项。} 我已经尝试了很多解决方案,不管它们是什么,如果代码中有save
Error Domain=NSCocoaErrorDomain code=3840“JSON文本未以数组或对象开头,允许未设置片段的选项。”UserInfo={NSDebugDescription=JSON文本未以数组或对象开头,允许未设置片段的选项。}
我已经尝试了很多解决方案,不管它们是什么,如果代码中有save函数,上面的错误消息仍然会从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.");
}
});
});
(我在前面创建了一个类似的问题,但出现了相同的错误,但此后重新编写了代码,因此我不想将这两个问题混在一起。)保存是异步的,这意味着它们发生在单独的线程中。在调用
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请求、获取、查询、销毁和调用其他云函数时也会遇到同样的问题;已在解析服务器版本2.3.0(2016年12月7日)中被弃用。从那个版本开始,它是一个无操作(它什么也不做)。现在,您应该将{useMasterKey:true}可选参数插入到需要在代码中重写ACL或CLP的每个方法中。