Cómo organizar controladores Express para bases de código grandes

Hace tres años, comencé a desarrollar una API Express.js para una empresa. Me preguntaba cuál podría ser la mejor arquitectura de controladores para mantenerse organizado a medida que crece la base de código.

Influenciado por Sails or Rails y por mi investigación, llegué a crear mi propio sistema. No quería sobrecargar mi proyecto usando un marco completo como Sails, sino elegir dependencias más ligeras cuando sea necesario.

Así que creé un sistema de organización para los controladores de la aplicación que combiné con un cargador casero . Desde entonces, mejoré ambos gracias a la experiencia que adquirí al implementarlo en otros proyectos.

Hoy, estoy lo suficientemente seguro con este método para compartirlo, ya que los resultados son convincentes.

Por lo que sé, es utilizado por algunas grandes empresas. Simplifica la incorporación de nuevos desarrolladores, ya que facilita la lectura del código base.

✅ Aquí se explica cómo configurar una arquitectura de controladores limpia.

La estructura

Si no anticipa el crecimiento de su aplicación, rápidamente tendrá una base de código desorganizada. Diseñé el método de organización para tener una amplia compatibilidad, lo que significa que algún día no estarás encerrado en un tipo de caso de uso que no puedas resolver con este método.

Configura tu árbol de archivos

  • Rutas grupales en controladores
  • Crea carpetas para cada controlador
  • Cree un archivo de enrutamiento en cada controlador que describa la ruta de cada ruta, el método a llamar, su middleware asociado opcionalmente y el nivel de restricción.
  • Cree un archivo para las acciones de cada controlador que contenga el método a ejecutar y los middlewares .
  • Cree un archivo de especificaciones para probar

Veamos cómo queda.

No tenga miedo de crear muchos archivos . No ralentiza el desarrollo y hace que su código base sea ordenado y aireado. ✨

Carga tus rutas

Para que las cosas funcionen siguiendo la estructura definida anteriormente, necesitamos usar un cargador simple que creé: Lumie. Pasará por sus controladores, leerá los archivos de definición y cargará sus rutas.

Es un paquete pequeño, puede verificar el código fuente en GitHub.

Archivos de enrutamiento

Se han diseñado para que sean fáciles de leer. El propósito es poder identificar métodos para actualizar en desarrollo al echar un vistazo rápido a sus archivos .routing . En el siguiente ejemplo, se crearán tres rutas:

  • [PUT] / usuario
  • [GET] / usuario
  • [OBTENER] / usuario / restablecer contraseña

Se pregunta por qué las rutas tienen el prefijo " usuario " aunque no se describe en la definición de enrutamiento. Lumie usa el nombre de la carpeta en la que se encuentra el archivo de enrutamiento para prefijar las rutas.

Aquí estamos controllers/user/user.routing.js. Si la usercarpeta ha estado en una subcarpeta, adminpor ejemplo, las rutas tendrían el prefijo admin/user.

Tenga en cuenta que puede pasar un pathcampo opcional a la definición de enrutamiento para que se use en lugar del predeterminado.

Acciones y middlewares

Como puede ver arriba, cada configuración de rutas tiene un método de acción que no es más que la lógica a ejecutar cuando llamamos a su ruta API. Recomiendo mantener en un archivo: un método de acción y su middleware asociado opcional .

Restricciones

Para cada configuración de rutas, elegirá el nivel de restricción asociado. El valor del nivel se pasará a la función de restricción que creará para que Lumie funcione. Vea cómo inicializar Lumie con su propia función de restricción.

Esta debería ser solo una función que devuelva un middleware express clásico.

Conclusión

He estado usando este método por un tiempo. Me gusta tener este tipo de marco obstinado a seguir cuando desarrollo. Al final del día, me está ayudando a mantener una base de código agradable y a no tomar atajos como escribir demasiada lógica en un archivo o definir una ruta en un archivo inapropiado.

Gracias por leer. Dime en los comentarios lo que piensas acerca de organizar los controladores de esta manera.

Si este artículo le resultó útil, ¿podría dejarlo caer? ?