express.jsでMVC

ChainZ(クリエイター)
いろいろやってます。

npmには便利なモジュールがいっぱいあります。それを活用すれば、簡単にexpress.jsMVCモデルが構築できます。この記事では、下記のモジュールを使って、express.jsMVCを構築します。

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)

Mongoosemongodbmoduleです。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.jsjadeを実装

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を開いて、一行目にcontrollersrequire:

var controllers = require('../controllers');

そのあと、ルーターのルールを追加します。

router.get('/book', controllers.root.index);

これで、express.jsMVCモデルが完成です。