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

Posted

技术标签:

【中文标题】typescript node.js express 路由分隔文件的最佳实践【英文标题】:typescript node.js express routes separated files best practices 【发布时间】:2016-09-07 03:32:58 【问题描述】:

在 Node 项目中使用 Express 和 Typescript 什么是 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;
    )();

    //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')
        ;

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

export = (function())();

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

或者使用另一种模式会更好,也许是利用该模式的一种

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

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

【问题讨论】:

【参考方案1】:

在 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

【讨论】:

那个表情包是个杀手,非常感谢你的链接! 使用 @types/express 升级到 TS2 会抛出 error TS4023: Exported variable 'router' has or is using name 'Router' from external module "[...]/node_modules/@types/express-serve-static-core/index" but cannot be named.。任何想法如何解决这个问题? 显然解决方案是显式注释路由器变量(见http://***.com/questions/41847314) 哦,模因不见了... :( *** 上的模因...难得一见的 xD

以上是关于typescript node.js express 路由分隔文件的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

node.js/typescript 找不到本地模块

在 node.js 中扩展 TypeScript 全局对象

Node.js、TypeScript、JavaScript 和 Angular 之间的连接 [关闭]

Typescript:如何解析 node.js 的绝对模块路径?

nodemon 没有在 webpack-typescript-node.js 中监视目录?

在 Node.js 和 Vue.js 之间共享 TypeScript 代码