DEV Community

Cover image for Reduzindo a redundância do arquivo de rotas - Node.js, ES6 e TypeScript
rodrigozan
rodrigozan

Posted on

Reduzindo a redundância do arquivo de rotas - Node.js, ES6 e TypeScript

Essa dica simples e rápica te ajudará a reduzir a redundância do seu arquivo de rotas usado no Node.js com ES6 **e **TypeScript.

Quando me toquei disso eu quase caí para trás.

Fala galera, tudo tranquilo? Rod Zandonadi na área. E hoje eu quero falar sobre rotas. Antes de ler esse artigo, fique atento que estou trabalhando com node.js e typescript. Porém, como você vai reparar nos códigos abaixo, essa implementação não depende de tipagem. Nesse caso, se você estiver usando ES6 sem typescript, essa solução vai funcionar muito bem

Meu código, apesar de limpo, estava redundante e gerando uma alta manutenibilidade. Ou seja: toda vez que eu precisava criar uma nova rota, precisava atualizar esse arquivo.

Esse e o formato que meu router.ts estava anteriormente:

import { Router } from 'express'

import user from './routes/UserRoutes'
import auth from './routes/AuthRoutes'
import changePassword from './routes/ChangePasswordRoutes'
import post from './routes/PostRoutes'
import scales from './routes/ScalesRoutes'
import songs from './routes/SoungRotes'

const router = Router()

router.use(user)
router.use(auth)
router.use(changePassword)
router.use(post)
router.use(scales)
router.use(songs)

export default router
Enter fullscreen mode Exit fullscreen mode

Cada solicitação tinha seu próprio arquivo de rotas no diretório routes. O objetivo do router.ts é centralizar essas rotas e enviá-las ao app.ts, onde eu seto a rota '/api' para que todas elas fiquem filhas dessa rota principal.

Agora, se eu uso o mesmo diretório para todas as rotas, porque raios estou quebrando a cabeça atualizando o arquivo routes.ts o tempo todo?

Olha só o estado que meu router.ts está, depois de analisar e pesquisar formas de otimizá-lo:

  • Redundância: Os imports de rotas individuais repetem-se e ocupam espaço desnecessário.
  • Manutenibilidade: Adicionar novas rotas exige modificação constante do arquivo.
  • Princípio DRY (Don't Repeat Yourself): O código atual repete o padrão de importação e uso de rotas.

Mas vamos parar de enrolação e vamos melhorar esse trem. Afinal, trabalhar com Node.js e ES6 (sem esquecer do TypeScript) tem inumeras vantagens

Comecemos com a importação. No lugar de importar toooodas as rotas da api (e, convenhamos, dependendo do projeto, como esse meu que só cresce, o número de rotas cresce de forma devastadora), vamos usar import * as.

import { Router } from 'express'
import * as routes from './routes'

Enter fullscreen mode Exit fullscreen mode

Legal, mas como fazemos com o resto do código?

Vamos criar um array com todos os valores do objeto routes. No caso, routes é um objeto que contém todas as rotas importadas. Então é só exportar routes para o app.ts.

const router = Router()

Object.values(routes).forEach(route => router.use(route))

export default router

Enter fullscreen mode Exit fullscreen mode

O resultado é um arquivo de rotas com código limpo, organizado e de 0 (eu disse zero) manutenção.

Segue o código completo do nosso arquivo de rotas da nossa API Node.js com ES6 e TypeScript:

import { Router } from 'express'
import * as routes from './routes'

const router = Router()

Object.values(routes).forEach(route => router.use(route))

export default router

Enter fullscreen mode Exit fullscreen mode

Atenção: para isso funcionar, é necessário a criação de mais um arquivo. Um index.ts no diretório de rotas.

Pô cara, fez eu ler até aqui pra dizer que tem que fazer outro arquivo?

Calma, pequeno padawan.

Este arquivo apenas exportará os modulos de rotas da nossa aplicação. Se tiver que criar uma nova rota, é só exportar nele e pronto.

Saca só:

export { default as user } from './UserRoutes'
export { default as auth } from './AuthRoutes'
export { default as changePassword } from './ChangePasswordRoutes'
export { default as post } from './PostRoutes'
export { default as scales } from './ScalesRoutes'
export { default as songs } from './SoungRotes'
Enter fullscreen mode Exit fullscreen mode

Viu, cabra apressado? Código limpo e de fácil manutenção.

Se eu quiser adicionar uma nova rota, no exemplo da minha aplicação, ministers, basta vir a esse arquivo e acrescentar a exportação:

export { default as user } from './UserRoutes'
export { default as auth } from './AuthRoutes'
export { default as changePassword } from './ChangePasswordRoutes'
export { default as post } from './PostRoutes'
export { default as scales } from './ScalesRoutes'
export { default as songs } from './SoungRotes'

/* New rote ministers */
export { default as ministers } from './MinistersRotes'
Enter fullscreen mode Exit fullscreen mode

É isso povo bonito. Otimização de código nas rotas de uma API desenvolvida em Node.js, ES6 e TypeScript (lembrando que essa otimização, o TypeScript é opcional, mas não funciona com Common Modules).

Curtiu? Se sim, deixa um comentário aí, filho de Deus.

Abração galera! Até a próxima!

Top comments (1)

Collapse
 
eriveltondasilva profile image
Erivelton da Silva

Parabéns pelo trabalho, amigo
Ficou top demais, bela dica
E se exportasse as rotas como padrão, não precisaria do { default as rota }, né