読者です 読者をやめる 読者になる 読者になる

鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

ニフティクラウドモバイルバックエンドと戯れる【リレーション編】

ニフティさんに登録したので早速開発再開。

Project->Person->Todo がある3階層モデルをニフティクラウドモバイルバックエンドに保存してやろうと 試みる。

var ProjectClass = NCMB.Object.extend("ProjectClass");
var newProject = new ProjectClass();
var projectMember = newProject.relation("projectMember");
var PersonClass = NCMB.Object.extend("PersonClass");
var newPerson = new PersonClass();
var TodoClass = NCMB.Object.extend("TodoClass");
var newTodo = new TodoClass();
var memberTodo = newPerson.relation("memberTodo");

newProject.save();
newPerson.save();
newTodo.save();
console.log("save objects");

projectMember.add(newPerson);
console.log("projectMember add");

memberTodo.add(newTodo);
console.log("memberTodo add");

そして、エラーが発生。

Uncaught You can't add an unsaved NCMB.Object to a relation. 

もしかして、saveメソッドが非同期だからまだセーブされてないと 言われているのかな。コールバック地獄にならないようにしないと・・・

でもって、コードを変えてこんなかんじで してみたら、リレーションが1階層にはつくのですが、projectMemberリレーションの方はダッシュボードでみても付かなかった。

var ProjectClass = NCMB.Object.extend("ProjectClass");
var newProject = new ProjectClass();
newProject.set("name","newProject");
var projectMember = newProject.relation("projectMember");
var MemberClass = NCMB.Object.extend("MemberClass");
var newMember = new MemberClass();
newMember.set("name","newMember");
var TodoClass = NCMB.Object.extend("TodoClass");
var newTodo = new TodoClass();
newTodo.set("name","newTodo");
var memberTodo = newMember.relation("memberTodo");

newTodo.save(null,{
    success : function (){
        console.log("save newTodo");
        memberTodo.add(newTodo);
        newMember.save( null,{
            success: function (){
                console.log("save newMember");
                projectMember.add(newMember);
                newProject.save(null, {
                    success: function(){
                        console.log("saved");
                    }
                });
            }
        });
    }
});

でも、ソースをコメントアウトしたらprojectMemberリレーションが付いた。 これはバグなのか判断が難しい。コミュニティにきいてみるか・・・

//newTodo.save(null,{
//    success : function (){
//        console.log("save newTodo");
//        memberTodo.add(newTodo);
        newMember.save( null,{
            success: function (){
                console.log("save newMember");
                projectMember.add(newMember);
                newProject.save(null, {
                    success: function(){
                        console.log("saved");
                    }
                });
            }
        });
//    }
//});

というわけで、issueを発行しました。 https://github.com/NIFTYCloud-mbaas/UserCommunity/issues/56

ほんと、コミュニティでいろいろ教えていただき。原因もわかりました。 頑張らねば・・