albatrosary's blog

UI/UXとエンタープライズシステム

SPA開発のために 〜 Express編およびmongoose編 〜

前回、データベースのインストールを行ったので、今回はアプリケーションサーバの構築を行います。今回はExpressを利用します。Expressはnode上で動くWeb Applicationフレームワークです。日本語ドキュメントもあります。インストールはいたって簡単でnpm installで完了です。

 

Express - node Webフレームワーク | 日本語ドキュメンテーション

 

Expressを使ってみる

f:id:albatrosary:20140716095643p:plain

Expressのインストール

npm installで簡単にインストールできます。

$ npm install -g express

簡易アプリケーションの作成

サンプルアプリケーションを作り動かすことは用意です。次のコマンドを実行してください。

$ express ~/Projects/express-app && cd $_
…
   create : /Users/albatrosary/Projects/express-app/bin
   create : /Users/albatrosary/Projects/express-app/bin/www

   install dependencies:
     $ cd /Users/albatrosary/Projects/express-app && npm install

   run the app:
     $ DEBUG=express-app ./bin/www
$ $ npm install

アプリケーションの起動

作ったアプリケーションを実行します。

$ DEBUG=express-app ./bin/www

もしくは

$ npm start

f:id:albatrosary:20140716095951p:plain

以上でExpressのインストールおよびサンプルアプリケーションサーバの実装まで行いました。続いて今作成したアプリケーションサーバとmongoDBを連携させます。この連携にはmongooseを利用します。urlを「/users」とすると次の画面が表示されます。

f:id:albatrosary:20140716114906p:plain

ExpressとmongoDBを連携させる(mongooseの利用)

f:id:albatrosary:20140716101741p:plain

mongooseのインストール

インストールしたアプリケーションサーバのディレクトリで次のコマンドを発行します。package.jsonにmongooseが登録されているのが確認できます。

$ npm install mongoose --save
-- package.json
{
  "name": "express-app",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "express": "~4.2.0",
    "static-favicon": "~1.0.0",
    "morgan": "~1.0.0",
    "cookie-parser": "~1.0.1",
    "body-parser": "~1.0.0",
    "debug": "~0.7.4",
    "jade": "~1.3.0",
    "mongoose": "^3.8.13"
  }
}

実装してみる

サンプルプログラムの中にroute/users.jsというファイルがあるのでここをカスタマイズします。前回作成したデータベース「mydb」に接続しコレクション「testdata」からレコードを抽出します。

-- route/users.js
var express = require('express');
var router = express.Router();
var testData;
var mongoose = require('mongoose');

// スキーマ型定義
var schema = mongoose.Schema({
    name: String
})

// フォーマット「mongodb://[hostname]/[データベース名]」
mongoose.connect('mongodb://localhost:27017/mydb');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
    console.log("Connected to 'mydb' database");

    // アクセスするコレクションを指定 
    testData = mongoose.model('testData', schema);
});
router.get('/', function(req, res) {
    testData.find({}, function(err, results) {
        console.log(testData);
        if (err) {
            res.send({'error': 'An error has occurred'});
        } else {
            console.log('Success: ' + JSON.stringify(results));
            res.json(results);
        }
    });
});
module.exports = router;

注意事項ですが、mongoクライアントで発行したコレクション名とmongooseで定義したコレクション名が異なることに注意が必要です。mongooseで定義した「testData」はmongoDBにアクセスするときの名前は「testdatas」になっていることに注意してください。つまり、すべて小文字になり最後に「s」が付与されます。ログを出力してますので参考までに。

f:id:albatrosary:20140716115403p:plain

結果は以下の通りです。

f:id:albatrosary:20140716114448p:plain

f:id:albatrosary:20140716114512p:plain