Express es un marco simple y minimalista para aplicaciones web en Node.js. Express proporciona una rica colección de funciones para el desarrollo de aplicaciones web y móviles. En cualquier aplicación web o móvil, cada módulo o capa solo debe ser responsable de una sola tarea y no debe ocuparse de otras tareas. Esto permite dividir la aplicación en bloques de construcción más pequeños, lo que ayuda a reducir la complejidad del código y la abstracción de datos de otras capas.
Aplicando un concepto similar a la estructuración del proyecto de Express, la separación de la lógica de la aplicación del servidor permite que el código sea modular y siga un modelo MVC (Modelo-Vista-Controlador). La separación es esencial para reducir el acoplamiento y para encapsular y abstraer la lógica interna de la aplicación .
Cada uno de los componentes y sus responsabilidades en Express se analizan a continuación:
Servidor: El servidor es responsable únicamente de la inicialización del middleware, la configuración del motor y las rutas a través de las cuales se realizan las requests. Estas rutas consisten en la lógica principal de la aplicación o función.
A continuación se muestra el fragmento de código de lo que se incluye en el archivo server.js.
// A function to initialize the server // configuration, middleware and routes const server = express(); create = function (config) { // Get routes from routes directory let routes = require('./routes'); // Configure the server settings server.set('env', config.env); server.set('port', config.port); server.set('hostname', config.hostname); // Returns middleware that parses json server.use(bodyParser.json()); // Set up routes for the server routes.init(server); };
App: El archivo ‘app’ contiene la lógica comercial principal de la aplicación web y es responsable de su ejecución. También contiene acceso a la base de datos back-end y modelos de datos. La ‘aplicación’ consta de dos componentes principales: rutas y controladores. Estos se discuten a continuación.
- Rutas: Las rutas, como su nombre lo indica, son las encargadas de definir las rutas dentro de la aplicación. Fragmento de código para definir rutas en
routes/index.js
.// routes/index.js
server.get(
'/'
,
function
(req, res) {
// Redirect request to /home route
res.redirect(
'/home'
);
});
server.use(
'/home'
, apiRoute);
server.use(
'/contact_us'
, homeRoute);
server.use(
'/about'
, errorRoute);
- Controladores: Los controladores contienen la lógica a ejecutar. También controlan las vistas renderizadas. Fragmento de código para definir controladores.
// controllers/home.js
function
index (req, res) {
console.log(
"On the home page"
);
// Write any other application logic here...
}
Ventajas de la separación de ‘servidor’ y ‘aplicación’:
- Abstracción y encapsulación de datos: mientras que el servidor consta solo de la lógica que se ocupa de la configuración del servidor, la configuración del middleware y la inicialización de las rutas, la aplicación se encarga de la lógica de la aplicación y abstrae el modelo de datos y la lógica comercial de la capa del servidor. Esto garantiza que la base de datos o los datos se extraigan de la capa del servidor y se encapsulen en la capa de la aplicación.
- Modularidad: al mantener separadas las funcionalidades del servidor y la aplicación, el código se divide en varios módulos, cada uno con una sola tarea o responsabilidad que realizar. Estos se pueden usar individualmente cuando sea necesario, ya que hay una dependencia reducida entre los módulos. El código duplicado se puede evitar mediante una clara separación de la lógica.
- Escalabilidad: a cada componente individual se le asigna una responsabilidad única. Esto permite realizar cambios rápidamente sin tener que realizar cambios en todas partes del código. Por ejemplo, considere la lógica de un módulo que se va a cambiar, que se utiliza como submódulo en varias otras funciones. Si la lógica es un módulo separado, el cambio solo tendría que hacerse en ese único módulo, en lugar de todas las funciones en las que ocurre el uso de la lógica.
- Reutilización: dado que la aplicación se divide en varios módulos a los que se les asigna una sola tarea, se pueden reutilizar en la aplicación varias veces cuando sea necesario. Por ejemplo, una aplicación que requiera la conversión de minutos a segundos varias veces podría definir esta conversión como una función separada, para evitar la molestia de volver a escribir la lógica en toda la aplicación una y otra vez.