情報アイランド

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

expressモジュールによるHTTPサーバ(6)パスのパラメータ

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

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

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

この記事ではexpressモジュールを使ってパスのパラメータを処理する方法について説明します。

パラメータ化

パスの一部をパラメータ化するにはパラメータ部分に:から始まる文字列を記述します。:の後の文字列がパラメータの名称となります。

たとえば、/user/:id/user/:id/:pageのようにします。これらの場合、idpageがパラメータの名称となります。

パラメータ

パラメータはreq.paramsにオブジェクトとして格納されています。

var express = require('express');

var app = express();
app.use('xxx', function (req, res, next) {
    var params = req.params;
    next();
});

なお、このプロパティには正規表現のパスのキャプチャグループも配列として格納されます。また、パスパターンの*に一致するパス部分も配列として格納されます。

パラメータを含むルート

アプリケーションのパラメータを含むルートに対する処理を追加するにはapp.param関数を使用します。

app.param('xxx', function (req, res, next, value, name) {
    next();
    //or
    next(new Error('aaa'));
});

第1引数にパラメータの名称を指定します。複数のパラメータの名称を配列として指定することもできます。

第2引数に処理を関数として指定します。

この関数の第1引数はreqです。

第2引数はresです。

第3引数は次の処理やミドルウェアを呼び出すための関数です。

第4引数はパラメータの値です。

第5引数はパラメータの名称です。

パラメータを含むルートに対する処理はアプリケーションに追加されたのと同じ順番で実行されます。また、ミドルウェアの処理の前に実行されます

サンプルコード1

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

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

express-server-param.js

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

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.get('/', function (req, res, next) {
    res.send('welcome to pizyumi\'s website. this is home page.\r\n');
});
app.get('/:name', function (req, res, next) {
    res.send('your name is ' + req.params.name + '.\r\n');
});
app.get('/:name/:age', function (req, res, next) {
    res.send('your name is ' + req.params.name + ' and your age is ' + req.params.age + '.\r\n');
});
app.param(['name', 'age'], function (req, res, next, value, name) {
    console.log('parameter name is ' + name + ' and value is ' + value + '.');
    next();
});
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-param.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: Mon, 26 Sep 2016 01:03:50 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/pizyumi
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET /pizyumi 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-osT4x5RHSDlUkHdecKJ5yA"
< Date: Mon, 26 Sep 2016 01:06:41 GMT
< Connection: keep-alive
<
your name is pizyumi.
* Connection #0 to host localhost left intact
C:\work\node>curl -v http://localhost:3000/pizyumi/26
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET /pizyumi/26 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: 42
< ETag: W/"2a-01OWFsmgLWqOTASjYMOFBg"
< Date: Mon, 26 Sep 2016 01:06:57 GMT
< Connection: keep-alive
<
your name is pizyumi and your age is 26.
* Connection #0 to host localhost left intact

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

パラメータを含むルートに対する処理が正しく行われていることが分かります。

C:\work\node>node express-server-param.js
http server is running...press enter key to exit.
parameter name is name and value is pizyumi.
parameter name is name and value is pizyumi.
parameter name is age and value is 26.

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

関連

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

-express, Node.js