Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

app.paramの条件が複数回一致する場合、都度実行される

express4において、ミドルウェア上のapp.paramの条件が複数回一致する場合、都度実行されます。

実際のところ

ミドルウェアの学習用に書いたスクリプトは以下の通り。
"$HOME/:id/:page"てなページにアクセスだけする想定です。

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

app.set('view engine', 'jade');

app.param(['id', 'page'], function (req, res, next, value) {
    console.log('Called.'); //(1)
    next();
});

app.param(['id'], function (req, res, next, value) {
    console.log(':id value', ' => ', value); //(2)
    next();
});

app.param(['page'], function (req, res, next, value) {
    console.log(':page value', ' => ', value); //(3)
    next();
});

app.get('/user/:id/:page', function (req, res, next) {
    console.log('req.path  ', req.path); //(4)
    next();
});

app.get('/user/:id/:page', function (req, res) {
    console.log('Coming the render section.'); //(5)
    var responseText = 'Your page name: ' + req.params.page + " !"; 
    res.render('index', { title: 'Our Apps!', message: responseText});
    res.end();
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

nodeを実行した後、http://localhost:3000/user/3/8にアクセスすると
f:id:shuzo_kino:20160214205923p:plain
と、まぁ順当な表示がでます。

コンソールを見ると

$ node app.js 
Example app listening on port 3000!
Sun, 14 Feb 2016 11:57:35 GMT
Called.
:id value  =>  3
Called.
:page value  =>  8
req.path   /user/3/8
Coming the render section.

上記からは

  • (1)は二度
  • (2),(3),(4),(5)は一度

呼ばれている事がわかります。