0

带有 Mongoose/Express 的 Backbone.js。

我很难理解如何与服务器上的数据库和模型进行通信。老实说,我不了解模型和服务器的关系。客户端上的模型是否与服务器上的模型同步?服务器上还有模型吗?目前在 MongoDB 中有填充数据,我要做的就是让 fetch() 工作。任何帮助都会很棒。当 Backbone 已经完成所有这些操作时,我试图避免使用 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在服务器上的用户模型上有一个字段,但从不将该属性发送到浏览器,因为这样做是不必要且不安全的。

关于您的代码摘录的几个要点。

fetch()无缘无故打了两次电话。你也在this.collectionView.bind('add', this.addOne);你想要的地方使用this.collectionView.on('add', this.addOne);bind用于固定this方法的上下文。on/off用于注册事件处理程序。

于 2012-12-08T01:51:09.633 回答