読者です 読者をやめる 読者になる 読者になる

Mongooseのラッパーを実装

Mongooseを色々触ってDRYじゃなくなってきたので、
前回のラッパーを改修+リファクタリング

細かいところは省略してコアだけを紹介。

models/models.js

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

/*---------------------------------------------
 * ModelModule定義
 *--------------------------------------------*/
/**
 * コンストラクタ
 * @document : ドキュメント名
 * @field    : フィールド定義 
 */
var ModelModule  = function(){};

/**
 * スキーマ作成
 */
ModelModule.prototype.create = function(){
  var ModelSchema = new Schema(this.field);
  mongoose.model(this.document,ModelSchema);
  this.scheme = mongoose.model(this.document);
  console.log('create collection '+this.document);

};

/**
 * コネクション接続
 */
 
ModelModule.prototype.connection = function(){
  mongoose.connect('mongodb://localhost/sample_db');
};
 
/**
 * コネクション切断
 */
 ModelModule.prototype.close = function(){
   mongoose.disconnect(function(err) {
     console.log(err ? err : 'connection close');
   }); 
 };

/*---------------------------------------------
 * Model定義
 *--------------------------------------------*/
var Model = function(document,field){
  this.document = document;
  this.field = field;
  this.scheme;
};

Model.prototype = new ModelModule();

/**
 * 更新用オブジェクト生成
 */
Model.prototype.getInstance = function(){
  return new this.scheme();
};

/**
 * SELECT
 */
Model.prototype.find = function(select,where,option){
  var own = this;
  
  return new Promise(function(resolve, reject) {
    
    own.scheme.find( where || null, select || null, option || null,function(err, docs){
      if(err) return err;
      result = [];
      
      docs.forEach(function(record){
        result.push(record);
      });
      resolve(result);
    });
  });
};

/**
 * UPDATE
 */
Model.prototype.update = function(values,where,atomic){
  this.scheme.update(where || {}, values, atomic || null, function(err){
    console.log(err ? err : "update success");
  });
};

/**
 * DELETE
 */
Model.prototype.remove = function(where){
  this.scheme.remove( where || null, function(err){
    console.log(err ? err : "update success");
  });
};

/*---------------------------------------------
 * コンストラクタメソッド定義
 *--------------------------------------------*/
var ModelCreate = function(document,field){
  
  //モデルを生成し、インスタンスを返す。
  model =  new Model(document,field);
  model.create();
  return model;
};

module.exports = ModelCreate;

実装側

models.task_model.js

var TaskModel = require('./models')('task',{'text':String});
module.exports = TaskModel;

controller

 TaskModel = require('../models/task_model.js');
    
router.post('/tasks', function(req, res, next) {
  
  //コネクション接続
  TaskModel.connection();
  

  TaskModel.remove({'text':''});

  task = TaskModel.getInstance();
  task.text = req.body.text;
  
  task.save(function(err){
    console.log( err ? err : 'insert success' );
  });

  TaskModel.update({'text':'UPDATE!!'},{'text':'CHANGE'});

  var result = TaskModel.find('text').then(function(result){
    res.json(result);
  });
  
});
module.exports = router;

find処理に関しては非同期だったため、待機処理で実装しています。