with sequelize query postgres node how and node.js model sequelize.js modularity

node.js - postgres - sequelize query



Break sequelize modelos en carpetas separadas (2)

Mi verdadera pregunta es: ¿es posible trabajar con la secuenciación de los Modelos en carpetas separadas?

Pregunto esto porque estoy tratando de trabajar con una estructura modular en mi aplicación, para lograr eso necesito tener el modelo, el controlador y las rutas en la misma carpeta, esto es lo que quiero decir:

├── node_modules ├── src │ ├── client │ │ └── ... //Frontend things managed by angular (like views, etc...) │ └── server | ├── components | | ├── db | | | ├── migrations | | | | ├── users.js | | | | └── ... | | | ├── seeders | | | ├── config.json | | | ├── options.json | | | └── index.js | | ├── env | | └── ... │ ├── modules //By module i mean an entity | | ├── users | | | ├── users.model.js | | | ├── users.controller.js | | | └── index.js //Here i define the routes | | └── ... | └── ... | ├── package.json └── server.js

¿Cómo podría hacer eso? ¿Cómo podría dividir los modelos en carpetas separadas?

Tal vez lo que estoy pidiendo es: ¿cómo podría configurar el script models / index.js para leer los modelos de cada directorio?

models / index.js

''use strict''; var fs = require(''fs''); var path = require(''path''); var Sequelize = require(''sequelize''); var basename = path.basename(module.filename); var env = process.env.NODE_ENV || ''development''; var config = require(__dirname + ''/../config.json'')[env]; var db = {}; if (config.use_env_variable) { var sequelize = new Sequelize(process.env[config.use_env_variable]); } else { var sequelize = new Sequelize(config.database, config.username, config.password, config); } fs .readdirSync(__dirname) .filter(function(file) { return (file.indexOf(''.'') !== 0) && (file !== basename); }) .forEach(function(file) { if (file.slice(-3) !== ''.js'') return; var model = sequelize[''import''](path.join(__dirname, file)); db[model.name] = model; }); Object.keys(db).forEach(function(modelName) { if (db[modelName].associate) { db[modelName].associate(db); } }); db.sequelize = sequelize; db.Sequelize = Sequelize; module.exports = db;

Algo que estaba pensando es buscar el xxx.model.js debajo de cada carpeta del directorio de módulos que tiene una estructura como esta:

modules ├── index.js //The above script configured to read the x.model.js in each folder ├── users | ├── users.model.js | ├── users.controller.js | └── ... ├── questions | ├── questions.model.js | ├── questions.controller.js | └── ... └── ...

NOTA: Vengo de un fondo de Laravel, supongo que las migraciones y los modelos son diferentes en la secuencia, ya que cuando defines un modelo, dices el tipo, etc. de la columna, lo mismo que la migración ...


Puedes usar la carpeta personalizada del módulo de nodo glob como quieras


Tienes que leer todos los modelos de diferentes carpetas existentes en tu directorio.

Agreguemos la función sortDir en models / index.js

sortDir clasificará todos los archivos js que existen en cada carpeta que tenemos en nuestro directorio en una matriz llamada archivos. Después de llamar a la función, podemos leer fácilmente nuestros modelos desde la matriz de archivos.

const files = []; const sortDir = (maniDir) => { const folders = []; const CheckFile = filePath => (fs.statSync(filePath).isFile()); const sortPath = (dir) => { fs .readdirSync(dir) .filter(file => (file.indexOf(".") !== 0) && (file !== "index.js")) .forEach((res) => { const filePath = path.join(dir, res); if (CheckFile(filePath)) { files.push(filePath); } else { folders.push(filePath); } }); }; folders.push(maniDir); let i = 0; do { sortPath(folders[i]); i += 1; } while (i < folders.length); }; sortDir(__dirname);

Ahora puede leer cada modelo después de ordenarlos de los archivos de matriz.

files .forEach((file) => { const model = sequelize.import(file); db[model.name] = model; });

¡Espero eso ayude!