web-dev-qa-db-ja.com

typescript node.jsエクスプレスルート分離ファイルのベストプラクティス

typeScriptとともにNodeプロジェクトでExpressを使用する場合、express.Routerの「ベストプラクティス」は何でしょうか。

ディレクトリ構造の例

|directory_name
  ---server.js
  |--node_modules
  |--routes
     ---index.ts
     |--admin
        ---admin.ts
     |--products
        ---products.ts
     |--authentication
        ---authentication.ts

したがって、index.ts内では、すべてのサブルーターをカプセル化して管理します。

    //admin.ts (nested inside of index.ts)
    import * as express from "express";

    export = (() => {
        
        let router = express.Router();
              
        router.get('/admin', (req, res) => {
            res.json({success: true});
        });
        
        return router;
    })();</ code>
    //index.ts (master file for express.Router)

    import * as express from "express";

    //import sub-routers
    import * as adminRouter from "./admin/admin";
    import * as productRouter from "./products/products";

    export = (() => {

      let router = express.Router();

      // mount express paths, any addition middleware can be added as well.
      // ex. router.use('/pathway', middleware_function, sub-router);

      router.use('/products', productRouter);
      router.use('/admin', adminRouter);

      //return for revealing module pattern
      return router;
    })(); //<--- this is where I don't understand something....

最後に、server.jsを設定します

    //the usual node setup
    //import * as *** http, body-parser, morgan, mongoose, express <-- psudocode

    import * as masterRouter from './routes/index'

    var app = express();
    //set-up all app.use()

    app.use('/api', masterRouter);

    http.createServer(app).listen(8080, () => {
          console.log('listening on port 8080')
        };</ code>

私の主な質問は本当に、index.ts(masterRouterファイル)であり、それはIIFeのネストされたルートです

エクスポート=(function(){})();

それはルーター用のTypeScriptモジュールを書くための正しい/最良の方法でしょうか?

または別のパターンを使用する方が良いでしょう、おそらくパターンを利用するもの

エクスポート関数fnName(){}-クラスcNameをエクスポート{}-デフォルトをエクスポートします。

iIFeの理由は、それらを別のファイルにインポートするときにモジュールを初期化する必要がなく、各タイプのルーターのインスタンスが1つしかないためです。

8
Andrei

回答

NodeJSでは、各ファイルはモジュールです。変数の宣言は、グローバル名前空間を汚染しません。したがって、変数を適切にスコープする(そしてグローバルな汚染/衝突を防ぐ)ために、古き良きIIFEトリックを使用する必要はありません。

あなたは書くでしょう:

_  import * as express from "express";

  // import sub-routers
  import * as adminRouter from "./admin/admin";
  import * as productRouter from "./products/products";

  let router = express.Router();

  // mount express paths, any addition middleware can be added as well.
  // ex. router.use('/pathway', middleware_function, sub-router);

  router.use('/products', productRouter);
  router.use('/admin', adminRouter);

  // Export the router
  export = router;
_

モジュールの詳細

https://basarat.gitbooks.io/TypeScript/content/docs/project/modules.html

私の反応 ????

私の主な質問は、実際には、index.ts(masterRouterファイル)であり、それがIIFeのexport = (function(){})();であるネストされたルートであり、ルーター用のTypeScriptモジュールを記述するための正しい/最良の方法である必要があります


(ソース: memesvault.com

16
basarat