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

NodeでMongooseを使ってみた

Expressをインストール。
今回はテンプレートを利用する。

$ npm install -g express-generator

続いてmongooseをインストール。

$ npm install mongoose

todo という名前でプロジェクト作成。

$ express todo

プロジェクトが生成されたら今回はUser管理は使わないのでUser定義を削除。
代わりにtasksを定義する。

app.js

:
var routes = require('./routes/index');
var tasks = require('./routes/tasks');
:
app.use('/', routes);
app.use('/tasks', tasks);
:

Userのviewも忘れずに削除。

$ rm view/user.jade

続いてModelを定義するディレクトリを作成

$ mkdir models 

Mongooseを定義するための共通moduleを作成

models/models.js

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

var Model = function(){};

Model.prototype.create = function(){
  var ModelSchema = new Schema(this.field);
  mongoose.model(this.document,ModelSchema);
};

Model.prototype.connection = function(){
  mongoose.connect('mongodb://localhost/sample_db');
};

Model.prototype.getInstance = function(){
  return mongoose.model(this.document) || null;
};

Model.prototype.close = function(){
  mongoose.disconnect(function(err) {
    console.log(err ? err : 'connection close');
  });
};

今回はTasksというコレクションを作成する。
とりあえずサンプルなのでフィールドは text のみ。

models/task_model.js

var Model = require('./models'),
    TaskModel = function(document,field){
      this.document = document;
      this.field = field;
    };

    TaskModel.prototype = new Model();

module.exports = new TaskModel('tasks',{ 'text': String });

これでModelの設定は完了。

続いて登録用のフォームを作成する。

view/index.jade

block content
  h1 TODO

  form(action='/tasks' method='post')
    input(type='text' name='text')
    input(type='submit')

POSTを受け取る処理を実装

routes/tasks.js

var router = require('./route.js').router,
    TaskModel = require('../models/task_model.js');

router.post('/tasks', function(req, res, next) {

  var TaskClass = {},
      task = {};

  TaskModel.create();
  TaskModel.connection();
  TaskClass = TaskModel.getInstance();

  task = new TaskClass();
  task.text = req.body.text;

  task.save(function(err){
    console.log( err ? err : 'insert success' );
    TaskModel.close();
  });

  res.render('index');
});

これでPOSTした値が新規レコードとして登録される。
Modelがシンプルじゃないので リファクタリングが必要.....