2

私は次のparse.comクラウドコードを持っています

Parse.Cloud.afterSave("Action", function (request) {

var BookStatus = Parse.Object.extend("BookStatus");
var Book = Parse.Object.extend("Book");
var book = new Book();

var actionType = request.object.get("actionTypePointer").id;
var bookId = request.object.get("bookPointer").id;

var queryBook = new Parse.Query("Book");
var newBookStatus;

queryBook.get(bookId,{
    success: function (gottenBook) {

        newBookStatus = "idOfTheBookStatus"; 

        book.id = bookId;
        book.set("bookStatus", new BookStatus({id: newBookStatus}));
        gottenBook.set("bookStatus", new BookStatus({id: newBookStatus}));

        //OPTION 1
        gottenBook.save(null,{
            success: function(data) {
                console.log("Bookstatus updated1");
            },
            error: function (data,error) {
                // error is a Parse.Error with an error code and description.
                console.log("Error: " + error.code + " " + error.message);
            }
        });
        //OPTION 2
        book.save(null,{
            success: function(data) {
                console.log("Bookstatus updated2");
            },
            error: function (data,error) {
                // error is a Parse.Error with an error code and description.
                console.log("Error: " + error.code + " " + error.message);
            }
        });

    },
    error: function (object, error) {
        // The object was not retrieved successfully.
        // error is a Parse.Error with an error code and description.
        console.log("Error: " + error.code + " " + error.message);
    }

});

OPTION1 bookStatus を返された本に設定した後、照会された本を保存しようとしました。

OPTION2 book.Id を設定した後、新しい book オブジェクトを保存しようとしました

        book.id = bookId;
        book.set("bookStatus", new BookStatus({id: newBookStatus}));

ただし、2 つのオプションのいずれかを使用すると、最終的に parse.com ログに記録されます。

エラー: 更新用の 101 オブジェクトが見つかりません エラー: 更新用の 101 オブジェクトが見つかりません

私が間違っていることについて何か考えはありますか?

前もって感謝します!

- 編集

フェッチによる新しい実装:

Parse.Cloud.afterSave("Action", function (request) {

var BookStatus = Parse.Object.extend("BookStatus");
var Book = Parse.Object.extend("Book");
var book = new Book();

var actionType = request.object.get("actionTypePointer").id;
var bookId = request.object.get("bookPointer").id;

book.id = bookId;
console.log("before fetch book.id" + book.id);
var newBookStatus;

book.fetch({
    success: function (book) {
        newBookStatus = "XMFkXS9NVv";            

        book.set("bookStatus", new BookStatus({id: newBookStatus}));

        console.log("book" + book);
        console.log("book.id" + book.id);
        console.log("book.isValid()" + book.isValid());

        book.save(null,{
            success: function(data) {
                console.log("Book Status updated to:" +newBookStatus);
            },
            error: function (data,error) {
                // error is a Parse.Error with an error code and description.
                console.log("Error: " + error.code + " " + error.message);
            }
        });
    },
    error: function (object, error) {
        // The object was not retrieved successfully.
        // error is a Parse.Error with an error code and description.
        console.log("Error: " + error.code + " " + error.message);
    }

});

});

結果:

  Input: {"place":{"__type":"GeoPoint","latitude":41.354643806134625,"longitude":2.121594674804572},"bookLocationDescription":"sad","bookPointer":{"__type":"Pointer","className":"Book","objectId":"kWcALge4az"},"actionTypePointer":{"__type":"Pointer","className":"ActionType","objectId":"kJC954w9iO"},"userPointer":{"__type":"Pointer","className":"_User","objectId":"6xpiAHX9Ju"},"createdAt":"2013-05-16T13:59:33.810Z","updatedAt":"2013-05-16T13:59:33.810Z","objectId":"PwlXhKL51l","ACL":{"6xpiAHX9Ju":{"read":true,"write":true},"*":{"read":true}}}
  Result: Success

I2013-05-15T20:52:19.170Z] before fetch book.idc1iKxw3NLD
I2013-05-15T20:52:19.273Z] book[object Object]
I2013-05-15T20:52:19.273Z] book.idc1iKxw3NLD
I2013-05-15T20:52:19.273Z] book.isValid()true
I2013-05-15T20:52:19.325Z] Error: 101 object not found for update
4

3 に答える 3

6

afterSave フックは、取得した本のオブジェクト ID を上書きしています。同じオブジェクト ID を設定している場合でも、オブジェクトはダーティであると判断し、有効な参照ではなくなります。

get()ID を更新せずに返された本を使用することで、これを回避します。

    Parse.Cloud.afterSave("Action", function (request) {

        var BookStatus = Parse.Object.extend("BookStatus");
        var Book = Parse.Object.extend("Book");
        var book = new Book();

        var actionType = request.object.get("actionTypePointer").id;
        var bookId = request.object.get("bookPointer").id;

        var queryBook = new Parse.Query("Book");

        var newBookStatus;

        queryBook.get(bookId,{
            success: function (book) {
                newBookStatus = "idOfTheBookStatus"; 

                book.set("bookStatus", new BookStatus({id: newBookStatus}));

                book.save(null,{
                    success: function(data) {
                        console.log("Bookstatus updated1");
                    },
                    error: function (data,error) {
                        // error is a Parse.Error with an error code and description.
                        console.log("Error: " + error.code + " " + error.message);
                    }
                });
            },
            error: function (object, error) {
                // The object was not retrieved successfully.
                // error is a Parse.Error with an error code and description.
                console.log("Error: " + error.code + " " + error.message);
            }

        });
    });

この書籍の ID は既にわかっているため、クエリを使用する代わりに、ポインターを作成して直接取得できます。

最後の afterSave フック:

    Parse.Cloud.afterSave("Action", function (request) {

        var BookStatus = Parse.Object.extend("BookStatus");
        var Book = Parse.Object.extend("Book");
        var book = new Book();

        var actionType = request.object.get("actionTypePointer").id;
        var bookId = request.object.get("bookPointer").id;

        book.id = bookId;

        var newBookStatus;

        book.fetch({
            success: function (book) {
                newBookStatus = "idOfTheBookStatus"; 

                book.set("bookStatus", new BookStatus({id: newBookStatus}));

                book.save(null,{
                    success: function(data) {
                        console.log("Bookstatus updated1");
                    },
                    error: function (data,error) {
                        // error is a Parse.Error with an error code and description.
                        console.log("Error: " + error.code + " " + error.message);
                    }
                });
            },
            error: function (object, error) {
                // The object was not retrieved successfully.
                // error is a Parse.Error with an error code and description.
                console.log("Error: " + error.code + " " + error.message);
            }

        });
    });
于 2013-05-15T18:17:50.767 に答える
2

これが私が走り回った後の方法です

ParseCrashReporting.enable(this);

// Enable Local Datastore.
Parse.enableLocalDatastore(this);

// Add your initialization code here
Parse.initialize(this, "*******", "******");

ParseUser.enableAutomaticUser();
ParseACL defaultACL = new ParseACL();

ParseACL.setDefaultACL(defaultACL, true);

// save the installation
ParseInstallation.getCurrentInstallation().saveInBackground();

この問題の詳細については、こちらのブログ投稿をご覧ください: http://aprogrammersday.blogspot.com/2015/02/fix-parse-101-error-object-not-found.html

于 2015-02-10T10:02:26.453 に答える
0

このエラーを探しているときに、このスレッドが最も役立つことがわかりました。本質object not found for get的にはforeign key reference not found.

エラーはnot found for get信じられないほど役に立たない場合があります。私にとっては、エラーが発生した行番号さえ与えられていませんでした.エラーメッセージは非常に曖昧であり、どのドキュメントでもフレーズへの参照を見つけることができませんでした.

このエラーが発生した場合は、パーミッションの問題に関する多くの参照が見つかりますが、既に を使用している場合はmaster key、選択したオブジェクトの外部キーによって参照されているオブジェクトを見つける必要があります。

于 2015-07-29T08:24:01.063 に答える