typescript node.js express路由分离的文件最佳实践



在Node项目中使用Express以及Typescript,这将是Express的"最佳实践"。路由器。

示例目录结构

|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;
    })();

    //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....

最后,我们将设置我们的服务器.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')
        };

我的主要问题是,是index.ts(主路由器文件),它是IIFe的嵌套路由

export=(function(){})();

这应该是为路由器编写typescript模块的正确/最佳方式吗?

还是最好使用另一种模式,也许是使用模式的模式

导出函数fnName(){}--导出类cName{}-导出默认值。

IIFe的原因是,当我将它们导入另一个文件时,我不需要初始化模块,并且每种类型的路由器只有一个实例。

在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

最新更新