Pesquisa de site

typescript node.js express rotas arquivos separados melhores práticas


usando Express em um projeto Node junto com Typescript, quais seriam as "melhores práticas" para express.Router.

estrutura de diretório de exemplo

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

então dentro do index.ts ele encapsularia e gerenciaria todos os sub-roteadores

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

por último, nós configuraríamos nosso 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')
    };

minha principal pergunta realmente é, é o index.ts (arquivo masterRouter) e suas rotas aninhadas que são IIFEs

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

isso deveria ser a maneira correta/melhor de escrever módulos TypeScript para roteadores?

ou seria melhor usar outro padrão, talvez um que utilize o padrão

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

a razão para o IIFe é que quando eu os importar para outro arquivo, eu não precisarei inicializar o módulo e haverá apenas 1 instância de cada tipo de roteador.

Resposta #1

No NodeJS cada arquivo é um módulo. Declarar variáveis não polui o namespace global. Portanto, você não precisa usar o bom e velho truque IIFE para definir corretamente o escopo das variáveis (e evitar poluição/colisão global).

Você escreveria:

  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;

Mais sobre módulos: https://basarat.gitbooks.io/typescript/content/docs/project/modules.html

Artigos relacionados