2012-12-08 6 views
0

Mongoose/Express가 포함 된 Backbone.js.Backbone.js Node.js 서버에서 모델에 액세스

서버에서 db 및 모델과 통신하는 방법을 이해하는 데 가장 힘든 시간을 보내고 있습니다. 솔직히 나는 모델과 서버의 관계를 이해하지 못한다. 클라이언트의 모델이 서버의 모델과 동기화됩니까? 서버에 모델이 있습니까? 현재 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:[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

생각해 볼 방법이 있습니다.

모델은 더 일관성있는 스키마 (예 : status, sockets 등)가있는 데이터 레코드를 나타냅니다. 이러한 레코드는 MongoDB 내부에서 정식으로 존재합니다. Mongoose는 node.js의 서버 코드에서 노드를 만들고, 쿼리하고, 업데이트하고, 삭제할 수있는 편리한 방법을 제공합니다. 따라서 서버 측에서는 MongoDB에서 데이터가 떨어져서 생기는 것이므로 Mongoose 스키마와 모델은 데이터와 상호 작용하고 조작하는 방법입니다.

브라우저에서 데이터 레코드를 나타내는 모델이 인 과 같지만 백본을 사용하여 만들고, 쿼리하고, 업데이트하고, 삭제합니다. 그리고 MongoDB 대신 브라우저의 관점에서 정식 데이터 레코드가 나머지 REST API 호출에 존재하며 백본이 도움이됩니다.

이제 서버의 Mongoose 모델과 클라이언트의 Backbone 모델은 자동으로 매핑되지 않습니다. 이는 단지 권장 아키텍처 일뿐입니다. 코드를 URL과 속성으로 적절히 연결해야 적절하게 일치시킬 수 있습니다. 서버의 사용자 모델에 bcryptedPassword 필드가있는 것처럼 일부 불일치는 있지만 브라우저에 불필요하고 안전하지 않으므로 해당 속성을 브라우저로 보내지 않는 등의 불일치가 있습니다.

코드 발췌 부분에 몇 가지 빠른 점이 있습니다.

아무 이유없이 fetch() 번을 두 번 호출합니다. this.collectionView.on('add', this.addOne);을 원하는 곳에 this.collectionView.bind('add', this.addOne);도 사용하고 있습니다. bind은 메서드에 대한 this 컨텍스트를 수정하기위한 것입니다. on/off은 이벤트 핸들러를 등록하기위한 것입니다.

관련 문제