Help us understand the problem. What is going on with this article?

長くなったapp.jsをどうにかしたい

More than 5 years have passed since last update.

node.jsのexpressでWebアプリを作っているとどんどんapp.jsが長大になっていくお・・・
というわけで分割する方法色々

機能毎に別アプリとして別ポートで起動させる

利用者側のapp.js、管理画面機能のmanager.jsとか完全に別のアプリとして実装、別ポートで起動、リバースプロキシで別のサブドメインを割り当ててさばく
セッション情報の共有(Cookieのdomain)に一工夫が必要だが、そもそも管理画面のセッション情報を利用者側のアプリで必要にすることなんてほぼないわけで
同じようにリバースプロキシを設定すれば別ポートのアプリ同士をディレクトリに見せかけることもできる

DBの接続情報などは設定ファイルに出せばいいので、これはこれで有効かなという気もする

Router機能を使う

今回のメインディッシュで例はExpress4前提

/などのメインはapp.js、/dir1以下はdir1.js、/dir2以下はdir2.jsでさばく
node app.jsで全部起動する

まず、dir1.js側の実装

dir1.js
var express = require('express');

module.exports = function(receiveFromAppJs){
    var router = express.Router();

    router.get('/foo', function(req, res){
        // ...
    });

    router.get('/bar', function(req, res){
        // ...
    });

    return router;
};

同じようにdir2.jsも作っておく
そしてメインのapp.js側で

app.js
//...
app.use('/dir1', require('./dir1.js')({a:1, b:2}));
app.use('/dir2', require('./dir2.js')({a:1, b:2}));
//...

と書いておけば

  • /dir1/fooのアクセスはdir1.jsの/fooに
  • /dir1/barのアクセスはdir1.jsの/barに
  • /dir2/fooのアクセスはdir2.jsの/fooに
  • /dir2/barのアクセスはdir2.jsの/barに

・・・という形にとりはからってくれる

{a:1, b:2}などはサブプログラムに渡したいオブジェクトを指定
サブプログラム側でreceiveFromAppJsで参照できるので、データベースの接続とかはここで渡すといいかもしれない

infiniteloop
「ソースコードでなんでも生み出す」なんでもない記号から、とんでもないモノを生み出す。日々技術を磨き続け、あらゆる難題に答えていく札幌のシステム会社です。
https://www.infiniteloop.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away