0

Mongoose/Express を使用した Backbone.js。

サーバー上のデータベースとモデルと通信する方法を理解するのに最も苦労しています。正直、モデルとサーバーの関係がよくわかりません。クライアント上のモデルはサーバー上のモデルと同期していますか? サーバー上にモデルさえありますか?現在、MongoDB にはデータが取り込まれており、私がやろうとしているのは、fetch() を機能させることだけです。どんな助けでも素晴らしいでしょう。バックボーンがすでにこれをすべて行っている場合、RESTful 呼び出しの使用を避けようとしています。

// CLIENT
// Lobby.js

(function($){

    var socket = io.connect('http://localhost:3000');

    var App = Backbone.Router.extend({
        routes: {
            '': 'lobby'
        },
        lobby: function () {
            var collection  = new Collection();
            var listView = new MatchListView(collection);

            collection.fetch();

            collection.fetch({success: function(){
                console.log("Fetch Success"); // => 2 (collection have been populated)
            }});
        }
    });

    var Model = Backbone.Model.extend();

    /**
    * Collection - bound to the server 
    * matchListView is listening for event changes
    */
    var Collection = Backbone.Collection.extend({
        url: 'lobby',
        socket:socket,
        model: Model,
        initialize: function(Collection){
            _.bindAll(this, 'addOne', 'removeOne', 'removeOne');

            this.ioBind('createMatch', this.addOne, this);
            this.ioBind('removeMatch', this.removeOne, this);
        },
        addOne: function(data) {
            this.add({id:data._id});
        },
        removeOne: function(data) {
            console.log('remove match ' + data._id);
            this.remove({id:data._id});
        }
    });

    /**
    * View - bount to collection
    * listening for changes to collection 'add' and 'remove'
    */  
    var MatchListView = Backbone.View.extend({
        el: $('body'),
        urlRoot: 'lobby',
        socket:socket,
        events: { 
            'click #create': 'createMatch'
        },    
        initialize: function(Collection){
            _.bindAll(this, 'render', 'renderCollection','addOne', 'removeOne', 'createMatch');

            this.collectionView = Collection;
            this.collectionView.bind('add', this.addOne);
            this.collectionView.bind('remove', this.removeOne);

            this._viewPointers = {}; // make sure we're starting over
            this.render();
        },
        render: function(){
            ...
        }
    });


    $(document).ready(function () 
    {
        //  create a new app and trigger the router.
        window.app = new App();
        Backbone.history.start();
    });

})(jQuery);

上記のページは /lobby にあります。サーバー上の mongoDB とそのスキーマは /mongo にあります

//SERVER
// Mongo.js

 /**
* Mongol Database
*/
var mongoose = require('mongoose');
var db = mongoose.createConnection('mongodb://localhost:27017/test');
//var db = mongoose.createConnection('mongodb://nodejitsu_cpiv:es7te3ognihsibnii3a7ekdfu3@ds043927.mongolab.com:43927/nodejitsu_cpiv_nodejitsudb7525674102');
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () 
{
    console.log("connected to database tester");
});

/* ====================
// Lobby 
// =================== */
var schema = mongoose.Schema,
    ObjectId = schema.ObjectId;

var lobbySchema = new schema({
    status:Number,
    sockets: [{ id:String, team:Number}],
    player1:{id:Number},
    player2:{id:Number}
});


// Collection
var Lobby = db.model('lobby', lobbySchema);
4

1 に答える 1

3

ここでは、それを考える方法を示します。

モデルは、多かれ少なかれ一貫したスキーマを持つデータ レコードを表します (この場合statusは 、socketsなど)。これらのレコードは、MongoDB 内に正規に存在します。Mongoose を使用すると、ノードの作成、クエリ、更新、および node.js のサーバー コードからの削除を簡単に行うことができます。したがって、サーバー側では、データは MongoDB に保存され、定義した Mongoose スキーマとモデルは、そのデータとやり取りして操作する方法です。

ブラウザーでは、データ レコードを表すモデルについて同じ概念がありますが、Backbone を使用してモデルの作成、クエリ、更新、および削除を行います。また、ブラウザの観点から見ると、MongoDB の代わりに、正規のデータ レコードがもう一方のエンド REST API 呼び出しに存在し、バックボーンが作成を支援します。

現在、サーバー上の Mongoose モデルからクライアント上の Backbone モデルへのマッピングは自動ではありません。あくまでも推奨アーキテクチャです。コードを URL と属性で適切に結び付けて、必要に応じて多かれ少なかれ一致させる必要があります。bcryptedPasswordサーバー上の User モデルにフィールドがあるが、そのプロパティをブラウザーに送信することは不要で安全でないため、送信しないなど、いくつかの不一致は問題ありません。

コードの抜粋に関するいくつかの簡単なポイント。

fetch()理由もなく2回電話をかけています。あなたはまたthis.collectionView.bind('add', this.addOne);、あなたが望む場所を使用していますthis.collectionView.on('add', this.addOne);。メソッドbindのコンテキストを修正するためのものです。イベントハンドラを登録するためのものです。thison/off

于 2012-12-08T01:51:09.633 に答える