NodeJsのアドベントカレンダー23日目の記事です
#はじめに
ExpressサーバーでRouteを定義していくとどんどん行数増えていってしまいますよね。
私も今までは処理をapp.jsに書かずfunctionの呼び出しで対応していたのですが、つい先日もっと上手に書く方法を知ったので共有したいと思います。
もしかしたら、当たり前なのかもしれませんが…。
#課題
参考書とかWeb見ながらExpress書くとこんな感じで、1つのファイルに全部のRoute書いてしまいがちかと思います。 はい、私がそうでした。
const express = require("express");
const app = express();
app.get('/user', (req, res) => {
...
})
app.post('/user', ...
app.patch('/user', ...
app.delete('/user', ...
app.get('task', ...
app.post'task', ...
※ ...はJavaScriptだと違った意味になってしまいますが省略の意味で見てください
サーバーに機能が増えていくと、五月雨式に行数が増えてしまい、メンテナンスが大変に。
チームで開発していたらたくさんの人が同時に同じファイルいじることにもなり、思わぬ事件になったり…。これをどうにかしたいと思います。
#解決方法
まずは機能のまとまりごとにファイルを作成します。
上記の場合、/user 系のためにuserRouter.js, /task系のためにtaskRouter.jsというファイルを作ります。
そして、それぞれのファイルの先頭でこんな感じの宣言をします。
const express = require("express");
const router = new express.Router();
そして、元のapp.jsから処理を移動してきます。※app.xxx はrouter.xxxに変えます。
router.get('/user', (req, res) => {
...
})
router.post('/user', ...
router.patch('/user', ...
router.delete('/user', ...
同じことをtaskRouter.jsにも実施します。
最後は元のapp.jsの修正です。
作成したrouterをrequireして、useするだけ。
const express = require("express");
const app = express();
app.use(express.json());
const userRouter = require('./userRouter')
const taskRouter = require('./taskRouter')
app.use(userRouter)
app.use(taskRouter)
無事、処理のほとんどが別ファイルに移動され、app.jsはすっきりしました。
こうすることで、新しいパスを作る時にもapp.jsの変更は2行だけ。メンテも簡単です。
#まとめ
個人的にはこれを知ってからapp.jsには処理をほとんど書かなくなりました。
コードも読みやすくなりますし、後からメンバー入っても影響範囲は最低限に抑えられます。よかったら試してみてください。
詳細を知りたい方はここの最後に書かれているexpress.routerを参照してください。