node.js embedの簡易版DB NeDBを使ってみる


node+expressで簡単なアプリ開発をしていて、シンプルなデータベースを使えたらなぁと思い調べてみたらNeDBというプロジェクトをgithub上で発見しました。

やはりクイックに開発するためにMySQLやMongoDBのインストールから始めたくないですよね。。NeDBというのはまだ日本語のドキュメントも存在しなくあまり知られていないですが、そこそこ活発に開発されているようなのでどんなものかと使ってみました。

以下はnode+expressの初期セットアップ環境+underscore templatesを想定しています。詳しくは前回の記事を参照してください。

NeDBのAPIはMongoDBとそろえているみたいです。MongoDBでいうcollectionがNeDBでいうDataSourceにあたります。
dbのファイルをdata/groups.dbとし、メインのapp.jsで以下のような記述を冒頭に足します。注意点はapp.use(‘/’, routes);の行より上に記述することです。(そうしないとrouter内にreq.dbが渡らない)。例がgroupなのはgroupの登録を想定したアプリを作ろうとしているからです。

app.js

var Datastore = require('nedb');
// create data collection
var db = {};
db.groups = new Datastore({filename: 'data/groups.db', autoload: true});
// Make our db accessible to our router
app.use(function(req,res,next){
    req.db = db;
    next();
});

試しに以下でDBにエントリを足してみましょう。

db.groups.insert({name: 'test'}, function(err, newDoc){});
db.groups.insert({name: 'test2'}, function(err, newDoc){});

その後、routes/index.jsでは以下のように記述します。

var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
    var db = req.db, groups = db.groups;
    groups.find({}, function(err, docs){
       res.render('index', { title: 'Underscore templates', groups: docs });
    });
});
module.exports = router;

renderの第二引数でfindしたアイテムを渡しているので、DBから取得したエントリがテンプレートに渡ります。
最後にviews/index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title><%=title%></title>
    </head>
    <body>
        <% _.each(groups,function(group, key, arr) { %>
            <div><%-group.name%></div>
        <% }); %>
    </body>
</html>

テンプレート内でeachを使って、ただgroupエントリのnameを出力しています。
これでlocalhost:3000にアクセスすると、足したエントリ”test”と”test2″が表示されるはずです。

内部的には単にテキストファイルに書き出しているだけのようですが、クイックに何か永続的にデータを保存するアプリを作成したい時には、これはなかなか使えそう!
MongoDBとAPIが統一されているおかげでデータを後でコンバートができるみたいなので、最終的にデータが膨大になった時にはコード変更なしでMongoDBに移行できるようです。

後日もう少し詳しい記事を書きました。

https://tejitak.com/blog/?p=296