在保存指针时,云代码会导致“尝试使用指向新的未保存对象的指针保存对象”

时间:2014-08-11 18:32:22

标签: parse-platform

在我的应用程序中,我有用户和帖子,我正在尝试实例化我的Activity类,它有指向用户和帖子对象的指针。这是我的代码:

var Activity = Parse.Object.extend("Activity");
var User = Parse.Object.extend("_User");
var Post = Parse.Object.extend("Posts");

var activityHandler = function(request, response){
    //toUser is the objectId of the User not the object itself.
    var toUserId = request.toUser;
    var fromUserId = request.fromUser;
    var postId = request.post;
    var arg = request.argument;


    var toUser = new User();
    toUser.set("objectId",toUserId);
    var fromUser = new User();
    fromUser.set("objectId",fromUserId);
    var post = new Post();
    post.set("objectId",postId);

    var activity = new Activity();
    activity.set("activityFrom", fromUser);
    activity.set("activityTo", toUser);
    activity.set("argument", arg);
    activity.set("post", post);
    activity.save(null, {
        useMasterKey: true,

            success: function(o){
        console.log("activity logged successfully");
        response.success();
            },
            error: function(err){
        console.log(err);
            },
        }
    );
};

Parse.Cloud.define("createActivity", activityHandler);

代码是不言自明的,但总而言之,客户端发送适当的用户和帖子ID,云功能应该实例化一个新的Activity对象,并指向用户和帖子。但是,当我试图保存时,我得到了:

{"code":141,"error":"Uncaught Tried to save an object with a pointer to a new, unsaved object."}

问题在于,发送给函数的对象ID是数据库中已经存在的完全有效的对象。 ACL也不是问题,因为我在主密钥上。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

这是我的坏事。

我的代码存在多个问题。

  1. 我使用object.set("objectId", id);语法,实际应该是object.id = id。我不确定是否有必要,也许没有这种改变也行不通,但我到处都读到这是一种不好的做法。

  2. 我没有正确获取请求参数。我使用request.param1而不是request.params.param1,并且参数变量未定义。我已经很长时间没有检查它是否未定义,因为从我的观点来看,错误消息对于参数未定义并不是很有帮助。 (现在它有意义,没有ID,它会自动尝试创建一个新对象)

  3. 我已经纠正了它们,现在确实可以正确保存。

答案 1 :(得分:0)

当您忘记调用方法时也会发生这种情况:

response.success(object);