Skip to content

node.jsから驚くほど簡単に使えるNoSQLサーバ Couchbase(CouchDB)を試す!

やあshi3zだ。

なんか昨日のnode.jsがあまりにも面白いので、すぐハマってしまったんだよねー。
そんなわけで(?)ちょっと欲が出て、node.jsから使えるいい感じのDBMS(データベース管理システム)はないかなーと思ってウロウロしてみたら、どうもCouchDB(カウチDB)ってのがいいらしい。

今日はそれでちょっとだけ遊んでみたぞ。

CouchDBは、Apacheプロジェクトの一部でオープンソースのNoSQLサーバだ。

面白いのは、CouchDBはDBMSでありながら、CouchDB自身の内部でJavaScriptを動かせるってこと。
だからCouchDB自身がDBMSでありながらアプリケーションサーバーとしても動作可能なのだ。

また、送受信されるデータ形式もJSONであり、JavaScriptとの親和性が高い。
だから、node.jsでデータベースを・・・という話になるといの一番にCouchDBが出てくるってわけだね。

さらにCouchDBをベースに開発された商用版がCouchbaseというわけで、こちらは有償サポートも受ける事が出来る。

ということは、お仕事にも積極的に使って行ける可能性があるってことだ。

今回はせっかくだから日本語での情報がほとんどないCouchbaseを試してみたぞ。

しかしまず驚いたのはその手軽さ。
Couchbase Single Serverをダウンロードしてダブルクリックしただけでもうデータベースが起動され、そこにアクセスするためのWebページまで開かれてしまった。

CouchDBは完全なRESTFULなので、要はWebサーバーが立ち上がったんだけど、こんなに簡単でいいのか!という感じ。

しかしもっと驚くのはこの先だった。

データベースの作成だ。

$ curl -X PUT http://localhost:5984/hoge
{"ok":true}

たったこれだけで新しいデータベース”hoge”が出来てしまった。

いいのか、それで、というレベルの簡単さだ。
今までSQLベースのデータベースのセットアップに何時間も苦しめられてきた身の上としては本当に「いいのか?それで」という気がしないでもないが、こんなに簡単なら言う事は無い。

セキュリティのことはちょびっと気になるが、それはさすがになんとかなるようになっているのだろう。
(ローカル環境ならどうとでもなるし)

もちろん、ブラウザ上から「Create Database」を選んでもデータベースを作る事はできるが、HTTPのリクエスト一発でデータベースを作成できるというのは革命的な簡単さではないだろうか。

なお、NoSQLなのでテーブルのような概念は特にないみたいだ。

とりあえずテスト用にkumaというデータベースを作ってみた。

$ curl -X PUT http://localhost:5984/kuma
{"ok":true}

それで、node.jsから使う方法だが、これにはcradleというライブラリを使うといいらしい。
というわけで

$ npm install cradle
cradle@0.5.5 ./node_modules/cradle
├── vargs@0.1.0
└── vows@0.5.11

でインストール。
あとはexpressでお決まりのapp.jsを生成するだけだ。

$ express couchtest

それから、app.jsを弄る。

app.js

/**
 * Module dependencies.
 */

var express = require('express'),
    cradle = require('cradle');

var app = module.exports = express.createServer();

// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

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

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

// データベースを初期化
var conn = new(cradle.Connection)();
var db = conn.database('kuma');

// Routes

app.get('/', function(req, res){ //なにもなかったらindex.jadeを表示

    res.render('index', {title:'hoge',flash: 'hoge-'});

});

app.post('/write', function(req, res){ //データベースにアクセスする処理

   var data = req.body;
    if(data){
      db.get(data.key, function(err, doc) { //データがあったらキーを表示
        if(doc) {
         flash= "KEY:"+ doc.key + " VALUE:" + doc.value;
         if(!data.value)data.value=doc.value;
        }else{
         flash ="Data Created";
        }
        db.save(data.key, data,
         function(db_err, db_res) {
           res.render('index', {title:'hoge',flash: flash});
            });
   
      });
    }else
         res.render('index', {title:'hoge',flash: ''});

});

app.listen(3000);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);

まあコード読んだらなんとなくわかるんでないの?という簡単さだ。
で、jade いう耳慣れないものが出てきたが、これもejsと同じようなテンプレートからHTMLをレンダリングするライブラリだ。

jadeはHAMLに似ているが、より簡潔にXHTMLを書けるようになっている

index.jade

h2 Message
p= flash
    h2 Data Input
    form(method='post', action='/write')
      label Key:
        input(name='key', type='text')
      br
      label Data:
        input(name='value', type='text')
      br
      button(type='submit') Submit

うん。非常にざっくりしている。

とにかく、準備するのはこの二つだけでとりあえずOKだ。

これで

$ node app.js
Express server listening on port 3000 in development mode

と実行すると、下図のような画面が表示される。

もとが適当なので画面も適当になってしまったが、気にしないでほしい。

ここにKEYとDATAという項目があるから、KEYにwise、DATAに9と入力すると・・・

ここで「submit」ボタンを押すと、app.’sのapp.post(‘/write’, function(req, res){ 以下の処理が呼び出される。

app.post('/write', function(req, res){ //データベースにアクセスする処理
   var data = req.body;
   if(data){
    db.get(data.key, function(err, doc) { //データを読み込む
             if(doc) {
                  flash= "KEY:"+ doc.key + " VALUE:" + doc.value;
          if(!data.value)data.value=doc.value;
             }else{
         flash ="Data Created";
         }
         db.save(data.key, data, function(db_err, db_res) { //データを保存する
                       res.render('index', {title:'hoge',flash: flash});
             });
    });
   }else
      res.render('index', {title:'hoge',flash: ''});
});

この場合、wiseというキーがないので、db.getではデータは見つからない。
見つからない場合でも、functionは実行されるので、そのなかでdocにデータがない場合は、新しいデータをセーブするということになる。

実際にデータをセーブしているのはdb.saveの部分。
セーブ完了後にres.render(‘index’,〜)でindex.jadeをレンダリングしている。

なぜこうした無名関数の応酬になっているかというと、それはnode.js自体の仕様にも関係してくるのでここでは割愛する。

しかし非常に手軽にデータベースを扱えるということはこの例だけでも十分良くわかるだろう。

うーん、node.jsとCouchDB、ひょっとすると大化けするかもしれないなあ。
実際既に大手でも本格的に使い始めている会社も出てきているみたいだし。
あとはこれらを活かしたコンテンツの登場をまつばかり・・・なのか?

このエントリーをはてなブックマークに追加
はてなブックマーク - node.jsから驚くほど簡単に使えるNoSQLサーバ Couchbase(CouchDB)を試す!
Post to Google Buzz
Share on GREE

Related posts:

  1. node.js + socket.io + enchant.js でつくる、リアルタイム通信ゲーム
  2. enchant.js + node.jsで作る非同期型ネットゲームのプロトタイプ
  3. 10分で作るnode.jsで動くリアルタイムwebチャット
  4. JavaScriptで MMOGをつくってみよう その4
  5. JavaScriptでMMOGをつくってみよう その7 JSON-RPC風通信

Facebook comments:

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*