2012-12-08 19 views
0

带Mongoose/Express的Backbone.js。Backbone.js Node.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); 

上面的页面住在/大堂。服务器上的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:[email protected]: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); 

回答

3

这里有一种方法来思考它。

模型代表了更多或更少一致的架构(statussockets,等你的情况)的数据记录。这些记录在MongoDB中正式生存。 Mongoose为您提供了创建它们,查询它们,更新它们以及从node.js中的服务器代码中删除它们的便捷方法。所以在服务器端,数据依赖于MongoDB,您定义的Mongoose Schema和Models是与数据交互和操作的方式。

在浏览器中,代表数据记录的模型的概念相同,但您使用Backbone创建它们,查询它们,更新它们并删除它们。从浏览器的角度来看,代替MongoDB,规范数据记录存在于另一个REST API调用中,这个骨干网将帮助您完成。

现在,服务器上的Mongoose模型到客户端上的骨干模型的映射不是自动的。这只是一个推荐的架构。您必须适当地将代码与URL和属性连接起来,以便根据需要或多或少地进行匹配。有些差异是可以的,例如在服务器上的用户模型上有bcryptedPassword字段,但从不将该属性发送到浏览器,因为这样做不必要也不安全。

您的代码摘录中的几个快速点。

您无缘无故地致电fetch()两次。您还需要this.collectionView.bind('add', this.addOne);this.collectionView.on('add', this.addOne);bind用于修复方法的上下文thison/off用于注册事件处理程序。

相关问题