No estoy seguro de cómo aplicar la arquitectura MVC a mi aplicación web de nodo, en concreto, separando el modelo del controlador.
La estructura actual tiene las vistas separadas correctamente (todos mis archivos .ejs) y luego supongo que mi app.js es como el controlador, ya que contiene todas las rutas para responder a las solicitudes http. Luego, las rutas se manejan en un archivo queries.js , que es donde consulto mi base de datos usando node-postgres (la mayoría de las vistas representadas muestran información de la base de datos o muestran formularios para que el usuario pueda insertar datos en la base de datos). ¿Debería hacer esto de manera diferente, o más específicamente, debería intentar crear un modelo que contenga datos sin procesar de la base de datos y hacer que los controladores de ruta manipulen estos datos en lugar de consultar directamente la base de datos (no estoy seguro de cómo manejaría la inserción en la base de datos entonces ...)? Solo me preocupa que la forma actual en que he estructurado mi aplicación web haga que sea difícil de administrar a medida que crece y que otros la entiendan y agreguen.
Este es un ejemplo de cómo está estructurada actualmente la aplicación web: digamos que un usuario hace clic en un botón para mostrar todos los pedidos activos, mi archivo app.js se vería así
const db = require('./queries') app.get('/activeorders', db.getActiveOrders) Mi archivo queries.js manejaría esta ruta así:
const Pool = require('pg').Pool const pool = new Pool({ user: process.env.USER, host: process.env.HOST, database: process.env.DB, password: process.env.PASSWORD, port: process.env.PORT, }) const getActiveOrders = (request, response) => { const queryOrders = 'SELECT * FROM orders WHERE complete=0 ORDER BY date_rec DESC;'; pool.query(queryOrders, (error, results) => { if(error) { throw error } var ordersObj = results.rows; response.render('pages/activeorders', { ordersObj: ordersObj }) }) } module.exports = { getActiveOrders, } Como se puede ver en el controlador, se consulta la base de datos y se almacenan los resultados en un objeto que luego se pasa al archivo activeorders.ejs cuando se procesa.
En el patrón MVC, dividimos cada parte de la aplicación porque este enfoque del desarrollo de software para necesidades complejas conecta la implementación a un modelo en evolución.
Le sugiero que visite sample-mvc-express-postgres para comprender el código de estructura
Si está interesado en el patrón de diseño, visite https://dev.to/salah856/implementing-domain-driven-design-part-i-5a72 . Este enlace explica cómo usar DDD en su aplicación y muestra cómo diseñar cada capa. de la aplicación
Tal vez usando un middleware que le permita crear una API desde una base de datos Postgresql.
Cualquier cambio realizado en las bases de datos se propagará y estará disponible para su API. También permitirá mucha modularidad a posibles filtros/seleccionar...
Y para consultas complejas, DBA podrá desarrollar procesos almacenados disponibles para todos por API. Esa es la capa Modelo . Solo SQL expuesto a través de un middleware.
El controlador será la forma en que realizó sus llamadas API y transformaciones de datos si es necesario para actualizar los datos en función de su Vista
Abstraer la capa del modelo con un middleware definitivamente es una gran economía de tiempo.
Establezca app.js como archivo raíz y cree un controlador y una carpeta modelo. Defina todos los modelos en la carpeta del model , mientras que en el controlador primero importe los controladores de archivos del modelo y cree todas las funciones de API o consultas. Luego, en el controlador de funciones del controlador de importación de archivos raíz app.js y ejecútelo.