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

在一个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里面会封装和pipe理所有的子路由器

  //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的原因是,当我将它们导入到另一个文件时,我不需要初始化模块,每个types的路由器只有一个实例。

回答

在NodeJS中, 每个文件都是一个模块 。 声明variables不会污染全局名称空间 。 所以你不需要使用旧的IIFE技巧来正确地确定variables的范围(并防止全球污染/碰撞)。

你会写:

  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(){})(); 应该是为路由器编写打字稿模块的正确/最好的方法

http://memesvault.com/wp-content/uploads/Hell-No-Meme-Gif-13.jpg