node.jsの下でbackbone.jsを使用します

ハブラハブルの読者の皆様、ご挨拶。 node.jsbackbone.jsを使用した経験を共有したいと思います。 以前、私はクライアントでbackbone.jsを積極的に使用していましたが、このライブラリはコードの構造化に非常に便利であることがわかりました。



データベースを操作しないサービスはサービスではありません。 私の場合、 mongodbがDBMSとして選択されました。 私はmongodbの既存のORMソリューションを見て、特にクライアントでも使用されるため、使い慣れたツールを使用する方が便利だと思われたので、モデルにBackbone.Modelクラスを使用すると同時に、これらすべてをmongodbにカスタマイズする方法を確認することにしました。





だから挑戦。 mongodbベースを使用する特定のサービスがあります。 特定のコレクションから必要なオブジェクトを取得するには、新しいオブジェクトを作成してデータベースに保存できる必要があります。 オブジェクトを変更した後、データベースからオブジェクトを保存および削除できるはずです。



Backbone.jsは、モデルとコレクションという2つの基本オブジェクトを提供します。 今後のすべてのクラスを継承し続けるレイヤーを作成します。 データベースに接続してコレクションを受信するためのコードを残し、すべてが順調であると仮定することをすぐに予約します。 エラー処理も無視します。 ほとんどどこでも、Deferredを使用しています。 したがって、誰がどんな動物なのかわからない場合は、 ここで詳細を読むことができます。 mongodbへのリクエストは、 この node.jsモジュールを介して行われます-これは完全に重要ではありません。 コードは場所が単純化されているため、プロジェクトで使用する場合、完全に真実ではない可能性があります。



ベースモデル


どういうわけかデータベースから単一のモデルを取得する必要があります。このメソッドはクラスの静的な部分にうまく収まると思います。

var BaseModel = Backbone.Model.extend({ idAttribute: "_id", },{ db_collection: null, //     fetchFromDb: function(filter, options){ var deferred = new Deferred(); if (typeof options === 'undefined') options = {}; db.getCollection(this.db_collection, function(err, collection){ collection.find(filter).toArray(function(err, items) { ret = new this(_.defaults(items[0], options)); } deferred.resolve(ret); }.bind(this)); ); return deferred.promise; } });
      
      





また、コードから、Backbone.Modelクラスのベースフィールドを再定義したことがわかります。このクラスは、オブジェクトのフィールドのリストでキーフィールドの名前を定義し、クラスの静的フィールドdb_collectionで、オブジェクトが属するコレクションを定義しました。



その後、たとえば、ユーザークラスを定義する場合:

 var User = BaseModel.extend({},{ db_collection:"users"});
      
      





たとえば、次のように特定のユーザーを取得できます。

 User.fetchFromDb({_id:1});
      
      





次に、作成したモデルを保存する方法を学習する必要があります。 これを行うために、backbone.jsは特別な同期メソッドを提供します。そのシグネチャは次のとおりです。

 function sync(method, model, options)
      
      





ここで:



 sync: function(method, model, options){ var fltr = {}; var deferred = new Deferred(); db.getCollection(this.constructor.db_collection, collectionReady.bind(this)); return deferred.promise; function collectionReady(err, collection){ function done(err, result){ if (options.success) options.success(result); //    backbone.js     deferred.resolve({context: this, result: true}); } fltr[this.idAttribute] = this.get(this.idAttribute); switch (method){ case "update": collection.update( fltr, this.toJSON(), {multi:false, upsert: true}, done.bind(this) ); break; case "create": collection.insert( this.toJSON(), {safe:true}, done.bind(this) ); break; case "read": collection.find(fltr).toArray(function(err, items) { done.call(this, false, items[0]); } }.bind(this)); break; case "delete": collection.findAndModify(fltr, [], {}, {remove:true}, function(err, items) { deferred.resolve(); }); } } },
      
      





ここでも複雑なことはありません。 モデルを変更する特定の方法ごとに、データベース自体でこのアクションを実行できるハンドラーを切断します。



ここで、ユーザーオブジェクトを作成した後、たとえば次のようになります。

 var user = new User({name:"Danil"});
      
      





安全に保存できます:

 user.save()
      
      





また、保存後に削除します:

 user.delete()
      
      





ベースコレクション


単一のモデルでの作業は十分に退屈なので、コレクションを実装します。特に、backbone.jsの基本クラスはこのためのものです。 モデルとの類推により、コレクションの基本クラスを再定義します。 今後のコレクションはすべて彼から継承されます。 まず、データベースから「生データ」のリストの抽出を記述します。

 var BaseCollection = Backbone.Collection.extend({ },{ db_collection: null, __fetchCollection:function(filter, collection){ var deferred = new Deferred(); function collectionReady(err, collection){ collection.find(filter).toArray(function(err, items) { deferred.resolve(items); }.bind(this)); } db.getCollection(collection_db, collectionReady, this); return deferred.promise; } });
      
      





ここで、データベースから「生データ」のリストを取得できる静的クラスメソッドを作成し、継承者がオーバーライドする静的db_collectionフィールドを追加して、このクラスがmongodbのどのコレクションに属するかを示します。



必要なモデルの初期化を追加するために残り、ベースコレクションクラスに別の静的メソッドを追加します。

 fetchFromDb:function(filter){ var deferred = new Deferred(); this.__fetchCollection(filter, this.db_collection).then( function(models){ deferred.resolve(new this(models)); }.bind(this) ); return deferred.promise; },
      
      





ここでは、「生データ」を取得し、このコレクションに関連付けられているモデル、データベースからのデータを初期化します。 もちろん、関連モデルからmongodbのコレクションの名前を取得できますが、これは単純化と見なします。



これで、ユーザーのコレクションを定義したら、データベースにクエリを実行して、ユーザーとオブジェクトを受け取ることができます。

 var Users = BaseCollection.extend({model:User}, {db_collection: "users"}); Users.fetchFromDb({name:"Danil"}).then(function(users){ _.each(users,function(user){console.log(user.id)}); });
      
      







その結果、mongodbで作業するために必要なすべての最小値を取得し、backbone.jsが提供する他の機会を利用できるようになりました。



All Articles