Express 4

Fast, unopinionated, minimalist web framework for Node.js

Getting started

Install

 

Express application generator

Express アプリのスケルトンをすばやく作るには、アプリケーション作成ツール (express) を使うとよい。これは、次のコマンドでインストールする。

$ npm install express-generator -g

-h オプションを使うとコマンドオプションを表示できる。

$ express -h

例えば、カレントディレクトリに myapp という Express アプリを作る場合は以下のようにする。

$ express myapp

次に依存するモジュール (dependencies) をインストールする。

$ npm install

アプリを実行する。

ブラウザで http://localhost:3000 を開く。localhost はケースにより変更が必要。

express ツールにより作成されたアプリの構成は次のようになる。

.
├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js
└── views
   ├── error.jade
   ├── index.jade
   └── layout.jade

 

Hello world example

ここで基本的な Express アプリの例を示す。

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('Hello World!');
});

var server = app.listen(3000, function () {

  var host = server.address().address;
  var port = server.address().port;
  
  console.log('Example app listening at http://%s:%s', host, port);
});

※ Node が提供する req (request) と res (response) は同じオブジェクトである。そのため、eq.pipe(), req.on('data', callback) 等をそのまま使用できる。

このアプリを開始しポート 3000 (/) をリスンするとサーバが "Hello World!" を返す。その他のパス (/ 以外) では 404 Not Found を返す。

ファイル app.js にこのソースを保存して次のコマンドを実行する。

$ node app.js

それから、http://localhost:3000 をブラウザで開く。

 

Basic routing tutorial

この章では Express の「ルーティング」について紹介する。ルーティングはクライアントからのリクエストにアプリがいかに応答するかを決めるのに使う。ここで、リクエストとは、URL、HTTP メソッドなどである。

各ルート (route) は1つ以上のハンドラを持ち、特に / はルート (root) に一致した場合を意味する。

ルートの定義は、次ののような構造を持つ。つまり app.METHOD(PATH, HANDLER) であり、app は Express のインスタンス、METHOD は HTTP のリクエストメソッド、PATH はサーバのパスで、HANDLER はルートが一致するとき実行される関数である。

※ この説明は、app という名前のインスタンスであることを前提にしている。もし、app を作成して実行させる方法を知らない場合は、Hello world の例を参照のこと。

次のコードは、app でのルートについての例である。

// respond with "Hello World!" on the homepage
app.get('/', function (req, res) {
  res.send('Hello World!');
});

// accept POST request on the homepage
app.post('/', function (req, res) {
  res.send('Got a POST request');
});

// accept PUT request at /user
app.put('/user', function (req, res) {
  res.send('Got a PUT request at /user');
});

// accept DELETE request at /user
app.delete('/user', function (req, res) {
  res.send('Got a DELETE request at /user');
});

ルーティングに関する詳細は routing guide を参照のこと。

 

Serving static files in Express

画像、CSS、JavaScript およびその他のスタティックなファイルの使用は、Express のビルトイン・ミドルウェア (express.static) により行われる。

ディレクトリの名前をスタティックなファイルの場所としてマークすると express.static ミドルウェアが直接、そこのファイルを使用できるようにする。例えば、public というディレクトリに画像や CSS、JavaScript などを置いておく場合、以下のようにすることで、これらを直接利用できる。

app.use(express.static('public'));

つまり、以下のように public ディレクトリのファイルをロードできるようになる。

http://localhost:3000/images/kitten.jpg
http://localhost:3000/css/style.css
http://localhost:3000/js/app.js
http://localhost:3000/images/bg.png
http://localhost:3000/hello.html

※ これらのファイルは、スタティックなディレクトリについて相対的になる。よって、スタティック・ディレクトリは URL の一部ではない。

もし、複数のスタティック・ディレクトリを持ちたい場合、express.static ミドルウェアを複数回呼び出せばよい。

app.use(express.static('public'));
app.use(express.static('files'));

ファイルを見つける先の順序は、express.static ミドルウェアの呼び出し順序と同じになる。

express.static で仮想パスを定義したい場合、次のようにスタティック・ディレクトリをマウントする。

app.use('/static', express.static('public'));

この場合、public ディレクトリのファイルは "/static"を付けてロードできるようになる。

http://localhost:3000/static/images/kitten.jpg
http://localhost:3000/static/css/style.css
http://localhost:3000/static/js/app.js
http://localhost:3000/static/images/bg.png
http://localhost:3000/static/hello.html

 

FAQ

自分のアプリをどう組み立てたらいいですか ?

この質問に決まった答えはない。それはアプリの規模や開発者によるからである。


モデルを定義するには ?

Express はモデルをサポートしていない。これは LoopBack のような 3rd パーティによりサポートされることを期待している。


認証機能は ?

Express は認証機能を持っていない。


どんなテンプレートエンジンをサポートしているか ?

Express は (path, locals, callback) シグネチャを処理できる任意のテンプレートエンジンをサポートする。


エラー 404 などをどう扱うか ?

Express では 404 はエラーではない。つまり、エラーハンドラ・ミドルウェアは 404 をキャプチャしない。

404 をハンドルしたい場合は、以下のようにする。

app.use(function(req, res, next) {
  res.status(404).send('Sorry cant find that!');
});

エラーハンドラを用意するには ?

他のミドルウェア同様、エラーハンドル用ミドルウェアを用意することができる。その場合のシグネチャは (err, req, res, next) となる。

app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

プレーン HTML をいかに表示するか ?

res.render() で HTML を表示する必要はない。