やあ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サーバーが立ち上がったんだけど、こんなに簡単でいいのか!という感じ。
しかしもっと驚くのはこの先だった。
データベースの作成だ。
{"ok":true}
たったこれだけで新しいデータベース”hoge”が出来てしまった。
いいのか、それで、というレベルの簡単さだ。
今までSQLベースのデータベースのセットアップに何時間も苦しめられてきた身の上としては本当に「いいのか?それで」という気がしないでもないが、こんなに簡単なら言う事は無い。
セキュリティのことはちょびっと気になるが、それはさすがになんとかなるようになっているのだろう。
(ローカル環境ならどうとでもなるし)
もちろん、ブラウザ上から「Create Database」を選んでもデータベースを作る事はできるが、HTTPのリクエスト一発でデータベースを作成できるというのは革命的な簡単さではないだろうか。
なお、NoSQLなのでテーブルのような概念は特にないみたいだ。
とりあえずテスト用にkumaというデータベースを作ってみた。
{"ok":true}
それで、node.jsから使う方法だが、これにはcradleというライブラリを使うといいらしい。
というわけで
cradle@0.5.5 ./node_modules/cradle
├── vargs@0.1.0
└── vows@0.5.11
でインストール。
あとはexpressでお決まりのapp.jsを生成するだけだ。
それから、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
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だ。
これで
Express server listening on port 3000 in development mode
と実行すると、下図のような画面が表示される。
もとが適当なので画面も適当になってしまったが、気にしないでほしい。
ここにKEYとDATAという項目があるから、KEYにwise、DATAに9と入力すると・・・
ここで「submit」ボタンを押すと、app.’sの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、ひょっとすると大化けするかもしれないなあ。
実際既に大手でも本格的に使い始めている会社も出てきているみたいだし。
あとはこれらを活かしたコンテンツの登場をまつばかり・・・なのか?
Related posts:
Post a Comment