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

问题描述 投票:0回答:1

在 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() {} -- 导出 class cName {} -- 导出默认值。

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

node.js express module typescript commonjs
1个回答
36
投票

在 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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.