express + mongoose
Express
Shinatra / Flask / Laravel みたいな軽量系 Web Framework
... Laravelはちょっと違うかもだけどまぁそんな感じ。
MySpaceが使ってるっぽい。 http://expressjs.com/applications.html
install
$ npm install -g express
Project の作成
$ express --css stylus myapp
$ tree myapp
myapp
├── app.js
├── node_modules
...
├── package.json
├── public
│ ├── images
│ ├── javascripts
│ └── stylesheets
│ ├── style.css
│ └── style.styl
├── routes
│ ├── index.js
│ └── user.js
└── views
├── index.jade
└── layout.jade
アプリケーション構成
app.js がメインファイルになり、ここにルーティングを書く。
/**
* Module dependencies.
*/
// ライブラリの読み込み
var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
// ルーティングの設定
app.get('/', routes.index);
app.get('/users', user.list);
// サーバの起動
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
app.get('/', routes.index);
のroutes
はvar routes = require('./routes');
で定義されており、routes/index.js
を指していることになる?。routes.index
はroutes/index.js
のexports.index
メソッド?関数?を呼び出す?
app.get('/users', user.list);
のuser
は、上記のvar user = require('./routes/user');
で定義されており、routes/user.js
のexports.list
メソッド?関数?が呼び出される。
Controller と View
routes/index.js
をみるとこんな感じ。
/*
* GET home page.
*/
exports.index = function(req, res){
res.render('index', { title: 'Express' });
};
res.render
メソッドでviews/
にあるテンプレファイルを読み込んで出力するみたい。
res.render(file, kv)
: file にはファイル名(拡張子抜き)、kvでテンプレに渡す変数を設定するっぽい。
View とか
標準では Jade というエンジンが動いてるっぽい。
Jade 文法はこんな感じ。
extends layout
block content
h1= title
p Welcome to #{title}
doctype html
html
head
title= title
link(rel='stylesheet', href='/stylesheets/style.css')
body
block content
インデントと関数っぽい要素の渡し方でHTMLを生成するっぽい
Deploy
forever を使うのがいいっぽい
$ pwd
/path/to/myapp
$ forever start app.js