疑問
expressのexpress-generatorというのはご存じでしょうか。
そのexpress-generatorで出てくる雛形はexpressのお手本のようなプログラムをしており、そこからプログラムを書いていくと、なかなか綺麗にまとまったプログラムが出来上がります。
そこで
var express = require('express');
var indexRouter = require('./routes/index');
var app = express();
//これのこと
app.use('/index',indexRouter);
//これのこと
という感じのメソッドが存在します。
これのおかげでプログラムを小分けにしてURLのディレクトリ毎のプログラムを書くことが出来るのですが、中にはexample.com/usersではなく、example.com/users/tanakaみたいなディレクトリを小分けにしたいこともあるでしょう。
細分化したURLに対応するすべてのroute関数を定義していくと、routesディレクトリ内のファイル数が大変なこといなります(一敗)。
そこで、routeファイルの中でさらにapp.use('/index',indexRouter)のような関数を定義することは出来ないだろうかと考えて一年近く放置してた疑問を、ようやくやる気を出したので、解決したことを記事にします。
実験
余計なものは省いた今回のファイル構成です
├─app.js
└─ routes
├─ users.js
└─ users
├─ tanaka.js
└─ hanako.js
app.jsはexpress-generatorで生成したままで大丈夫です。
users.jsを以下の通りに変更。
var express = require('express');
var router = express.Router();
var tanakaRouter = require('./users/tanaka');
var hanakoRouter = require('./users/hanako');
router.use('/tanaka', tanakaRouter);
router.use('/hanako', hanakoRouter);
module.exports = router;
usersディレクトリを作成し、tanakaとhanakoを作成。
var express = require('express');
var router = express.Router();
/* GET users listing. */
router.get('/', function(req, res, next) {
res.send('respond with Tanaka');
});
module.exports = router;
var express = require('express');
var router = express.Router();
/* GET users listing. */
router.get('/', function(req, res, next) {
res.send('respond with Hanako');
});
module.exports = router;
これで起動してみると無事respond with Tanakaと返ってきます。
つまり、出来るという結論です。
最後に
ぶっちゃけ文章べたすぎますね。。。
直せるように努力しましょう。