ネリモノ系

Twitter: https://twitter.com/msbtjp

node.js + express + mongodb + mongoose を試してみた

そんな組み合わせを使う機会に恵まれたのでせっかくだからメモ。
websocketとかやりたい人はそれようのサンプルがいっぱいあると思うのでそっちを見たほうがいいです。
mongodb は既にインストールされていることを前提として書きます。

# node.js のインストール
$ git clone git://github.com/ry/node.git
$ cd node
$ ./configure
$ make 
$ sudo make install

node.js がインストールできたら、ruby でいうところの gem のような npm をインストールして便利なものを追加していきます。

# npm のインストール
$ curl http://npmjs.org/install.sh | sudo sh
# node.js 用フレームワーク express のインストール
$ sudo npm install express
# node.js 用 ORM/ODM mongoose のインストール
$ sudo npm install mongoose

node.js で使える mongodb driver は、 mongoose の他にもいくつかあるようです。
http://www.mongodb.org/display/DOCS/node.JS



モデル定義。

// user.js
require.paths.unshift('vendor/mongoose');
var mongoose = require('mongoose').Mongoose;
var db = mongoose.connect('mongodb://localhost:27017/test');
mongoose.model('user', {
  properties: [
    'name', 'age', 'created_at',
  ],
  methods: {
    save: function (fn) {
      this.created_at = new Date();
      this.__super__(fn);
    }
  }
});
module.exports = db.model('user');



アプリを書きましょう。
※ /templates とか /static とかはそのうち使うと思うので書いておく。

// app.js
var express = require('express');
var app = express.createServer();
var User = require('./user');

app.configure(function(){
    app.set('views', __dirname + '/templates');
    app.use(express.methodOverride());
    app.use(express.bodyDecoder());
    app.use(app.router);
    app.use(express.staticProvider(__dirname + '/static'));
});

app.configure('development', function(){
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function(){
    app.use(express.errorHandler());
});

app.get('/', function(req, res){
    // インスタンス作成
    var u = new User();
    // データセット
    u.name = 'otsune-tan';
    u.age = '12';
    // 保存 
    u.save();

    // 読み出し & ブラウザへデータ送信
    User.find({'age':'12'}).all(function(docs){
      console.log(docs);
      res.send(JSON.stringify(docs)); // find().all() の結果を string にして出力してるだけ
    });
});

console.log('run server. port 8080.');
app.listen(8080);

ブラウザで http://localhost:8080/ にアクセスして、mongodb の中身がずらずらーっと出てきたら成功です。