Vyhledávání na webu

TypeScript Node.js Express trasy v oddělených souborech nejlepší postupy


použití Expressu v projektu Node spolu s Typescriptem, jaké by byly „nejlepší postupy“ pro express.Router.

ukázková struktura adresářů

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

takže uvnitř index.ts by to zapouzdřilo a spravovalo všechny pod-routery

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

nakonec bychom nastavili náš 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')
    };

Moje hlavní otázka opravdu je, jestli index.ts (soubor masterRouter) a jeho zanořené cesty jsou IIFE.

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

mělo by to být správný/nejlepší způsob, jak psát TypeScript moduly pro routy?

nebo by bylo lepší použít jiný vzor, možná takový, který využívá tento vzor

export function fnName() {} -- export class cName {} -- export default.

Důvodem pro IIFE je, že když je importuji do jiného souboru, nebudu muset inicializovat modul a bude existovat vždy jen jedna instance každého typu routeru.

Odpověď č. 1

V NodeJS je každý soubor modulem. Deklarování proměnných neznečišťuje globální jmenný prostor. Takže nemusíte používat starý dobrý trik IIFE k správnému ohraničení proměnných (a k zabránění znečištění/kolize globálních proměnných).

Napsali byste:

  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;

Více o modulech: https://basarat.gitbooks.io/typescript/content/docs/project/modules.html

Související články