express.jsでMVC
npmには便利なモジュールがいっぱいあります。それを活用すれば、簡単にexpress.jsのMVCモデルが構築できます。この記事では、下記のモジュールを使って、express.jsのMVCを構築します。
MVC parts | module |
---|---|
model | mongoose |
view | jade |
controller | * |
まずpackage.json
を開いて、dependencies
下記のコードを追加し、nom update
します。
"jade": "~1.6.0",
"mongoose": "~3.8.19"
nom install
を忘れずに〜
Model(Mongoose)
Mongooseはmongodbのmoduleです。Mongooseの使い方は公式サイトのドキュメントなどを参考すれば大丈夫でしょ!http://mongoosejs.com/index.html
express.jsのプロジェクトフォルダにmodelsというフォルダを作成します。中にindex.jsという空ファイルを用意します。例として、Book
というmodelを作りましょう。
まずmodels
フォルダにbook.js
を作成します。中身は:
// mongooseを使用
var mongoose = require('mongoose');
// Schemaを作成(テーブル構造)
// 詳しくはmongooseのドキュメントを参考してください。
var bookSchema = new mongoose.Schema({
title : {
type : String,
unique : true
},
author : {
type : Number
},
publishTime : {
type : Date
}
});
// モデルとしてexportします。
module.exports = mongoose.model('Book', bookSchema);
続いて、index.js
を編集します。
exports.Book = require('./book.js');
そうすると、下記のような使い方ができます。
var models = require('./models');
// 新規Bookデータ
var book = new models.Book;
book.title = 'My New Book';
book.author = 'Chain';
// データベースに入れる
book.save(function(err, book)) {
if (err) throw err;
if (! book) throw new Error('Failed in persisting. Check out your db connection.');
console.log(book);
}
View
express.jsのテンプレートエンジンには選択肢が結構多いです。個人的にはjadeをおすすめしたいです。jadeについては、公式ドキュメントで詳しく紹介されてるので、どうぞ:http://jade-lang.com/
express.jsにjadeを実装
app.js
に下記のコードを書けば、jadeが使えるようになります。
app.set('view engine', 'jade');
Controller
controllers
フォルダを作成し、中にindex.js
を作成します。同じフォルダにbook_controller.js
を作成します:
var models = require('../models');
(function book_controller()
{
// construct
})();
book_controller.index = function(req, res, next)
{
models.Book.find({}, function(err, books){
if (err) next(err);
// render 'book/index.jade'
res.render('book/index', {books : books});
});
}
module.exports = book_controller;
function(req, res, next)
はnode.jsでよく使うmiddleware
パタンです。三つの引数は
- request(req)
- response(res)
- next
となります。
使い方
routes/index.js
を開いて、一行目にcontrollers
をrequire
:
var controllers = require('../controllers');
そのあと、ルーターのルールを追加します。
router.get('/book', controllers.root.index);
これで、express.js
のMVCモデルが完成です。