情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

expressモジュールによるHTTPサーバ(7)ルータ

この記事は「expressモジュールによるHTTPサーバ」という連載記事の7つ目の記事です。

その他の記事に関しては下を参照してください。

また、HTTP自体について知りたい方は下を参照してください。

この記事ではexpressモジュールを使ってルータを作成する方法について説明します。

ルータとは

ルータとはミドルウェアの追加が可能なミドルウェアです。

ルータはexpress.Routerクラスのインスタンスとして表されます。以後このインスタンスをrouterと表記します。

アプリケーションにミドルウェアを追加するにはapp.use関数を使用します。ルータにも同様にrouter.use関数が提供されています。

アプリケーションにルートを追加するにはリクエストメソッドに応じてapp.get関数、app.post関数、app.put関数、app.delete関数などを使用します。ルータにも同様にrouter.get関数、router.post関数、router.put関数、router.delete関数などが提供されています。

アプリケーションのパラメータを含むルートに対する処理を追加するにはapp.param関数を使用します。ルータにも同様にrouter.param関数が提供されています。

ただし、router.param関数の第1引数には複数のパラメータの名称を配列として指定することはできませんので注意してください。

ルータの作成

ルータを作成するにはexpress.Router関数を使用します。

var express = require('express');

var router = express.Router({
    caseSensitive: false, 
    mergeParams: false, 
    strict: false
});

第1引数にオプションをオブジェクトとして指定します。この引数は指定しなくても構いません。

主なオプションには下のようなものがあります。

  • caseSensitive・・・パスの大文字と小文字を区別するかを真偽値として指定します。デフォルトはfalseです。
  • mergeParams・・・req.paramsにこのルータを追加したアプリケーションかルータのパラメータも格納するかを真偽値として指定します。デフォルトはfalseです。
  • strict・・・パスの末尾が/である場合にこの/ないものと見做さないかを真偽値として指定します。デフォルトはfalseです。

返り値としてルータが得られます。

ルータの追加

ルータはミドルウェアであるため、アプリケーションにルータを追加するにはapp.use関数を使用します。また、ルータにルータを追加するにはrouter.use関数を使用します。

ルータの作成と追加

ルータの作成とアプリケーションへの追加を同時に行うにはapp.route関数を使用し、ルータの作成と別のルータへの追加を同時に行うにはrouter.route関数を使用します。

var app = express();
var router = app.route('xxx');
var router = router.route('xxx');

第1引数にパスを指定します。

このパスの指定方法はapp.use関数の第1引数のパスの指定方法と同じです。

返り値としてルータが得られます。

サンプルコード1

クライアントからリクエストを受け取ったらリクエストメソッドやURLに応じて様々なテキストデータを返すHTTPサーバを作成し、起動します。

Enterキーが押されたらサーバを停止し、プログラムを終了します。

express-server-router.js

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

var router = express.Router({
    caseSensitive: true, 
    strict: true
});
router.use(function (req, res, next) {
    console.log('pass though router.');
    next();
});
router.get('/lukky', function (req, res, next) {
    res.send('this is lukky page.\r\n');
});
router.get('/unlukky', function (req, res, next) {
    res.send('this is unlukky page.\r\n');
});
router.get('/happy', function (req, res, next) {
    res.send('this is happy page.\r\n');
});
router.get('/unhappy', function (req, res, next) {
    res.send('this is unhappy page.\r\n');
});

var app = express();
app.set('env', 'development');
app.set('x-powered-by', false);
app.set('case sensitive routing', true);
app.set('strict routing', true);
app.use(function (req, res, next) {
    res.status(200);
    res.type('text/plain; charset=utf-8');
    next();
});
app.use('/txt', router);
app.get('/', function (req, res, next) {
    res.send('welcome to pizyumi\'s website. this is home page.\r\n');
});
app.get('*', function (req, res, next) {
    res.status(404);
    res.send(http.STATUS_CODES[404] + '\r\n');
});
app.all('*', function (req, res, next) {
    res.status(501);
    res.send(http.STATUS_CODES[501] + '\r\n');
});
var server = app.listen(3000, function () {
    console.log('http server is running...press enter key to exit.');

    process.stdin.on('data', function (data) {
        if (data.indexOf('\n') !== -1) {
            server.close(function () {
                console.log('http server closed.');
                process.exit(0);
            });
        }
    });
});
server.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

使用パッケージ

  • express
    npm install expressでインストールします。

実行結果

実行結果の確認のためにcURLを使用しています。

コードを実行するとHTTPサーバが起動します。

C:\work\node>node express-server-router.js
http server is running...press enter key to exit.

cURLを使ってサーバに対して様々なURLのHTTPリクエストを行います。

C:\work\node>curl -v http://localhost:3000/
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET / HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/plain; charset=utf-8
< Content-Length: 50
< ETag: W/"32-juTlohfTcZy04HpD+lfkLw"
< Date: Tue, 27 Sep 2016 01:02:18 GMT
< Connection: keep-alive
<
welcome to pizyumi's website. this is home page.
* Connection #0 to host localhost left intact
C:\work\node>curl -v http://localhost:3000/txt
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET /txt HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Content-Type: text/plain; charset=utf-8
< Content-Length: 11
< ETag: W/"b-+G1N6c4TYEJWpLR8VMBCIA"
< Date: Tue, 27 Sep 2016 01:02:20 GMT
< Connection: keep-alive
<
Not Found
* Connection #0 to host localhost left intact
C:\work\node>curl -v http://localhost:3000/txt/lukky
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET /txt/lukky HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/plain; charset=utf-8
< Content-Length: 21
< ETag: W/"15-Ph3x6C+VJJXsGXeaPoxPfQ"
< Date: Tue, 27 Sep 2016 01:02:39 GMT
< Connection: keep-alive
<
this is lukky page.
* Connection #0 to host localhost left intact
C:\work\node>curl -v http://localhost:3000/txt/unlukky
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET /txt/unlukky HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/plain; charset=utf-8
< Content-Length: 23
< ETag: W/"17-qwUbGRCZBJPYPVQfQhVpuw"
< Date: Tue, 27 Sep 2016 01:02:44 GMT
< Connection: keep-alive
<
this is unlukky page.
* Connection #0 to host localhost left intact
C:\work\node>curl -v http://localhost:3000/txt/happy
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET /txt/happy HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/plain; charset=utf-8
< Content-Length: 21
< ETag: W/"15-PaLlgvX6YToyc0ADQLTr1w"
< Date: Tue, 27 Sep 2016 01:02:52 GMT
< Connection: keep-alive
<
this is happy page.
* Connection #0 to host localhost left intact
C:\work\node>curl -v http://localhost:3000/txt/unhappy
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET /txt/unhappy HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/plain; charset=utf-8
< Content-Length: 23
< ETag: W/"17-67p/E7pHU1Wp/gzei9IJBQ"
< Date: Tue, 27 Sep 2016 01:02:55 GMT
< Connection: keep-alive
<
this is unhappy page.
* Connection #0 to host localhost left intact

サーバから正しくレスポンスが返っていることが分かります。

ルータの処理が正しく行われていることが分かります。

C:\work\node>node express-server-router.js
http server is running...press enter key to exit.
pass though router.
pass though router.
pass though router.
pass though router.
pass though router.

Enterキーを押すとサーバが停止し、プログラムが終了します。

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-express, Node.js