2015-09-13 10 views
6

Meine eigentliche Frage ist: Ist es möglich, mit Sequelize die Modelle in separaten Ordnern zu arbeiten?Break Sequelize Modelle in separaten Ordnern

Ich frage das, weil ich versuche, mit einer modularen Struktur in meiner Anwendung zu arbeiten, um zu erreichen, dass ich das Modell, den Controller und die Routen im selben Ordner haben muss, hier ist, was ich meine:

├── 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 

Wie könnte ich das tun? Wie könnte ich die Modelle in separate Ordner aufteilen?

Vielleicht was ich frage ist: Wie könnte ich das models/index.js Skript konfigurieren, um die Modelle aus jedem Verzeichnis zu lesen?

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; 

etwas, was ich dachte, ist für die xxx.model.js unter jedem Ordner der Module Verzeichnis eine Struktur wie folgt aussehen mit:

HINWEIS: Ich komme aus einem Laravel-Hintergrund, ich vermute, wie unterschiedlich sind Migrationen und Modelle in Sequelize seit wann Sie defi ne ein Modell, das Sie die Art sagen, etc .. der Säule, die gleiche wie die Migration ...

+0

Die meisten meiner Fragen wurden mit [docs] (https://github.com/sequelize/cli#options) gelöst, aber nicht mit dem Brechen des Modellordners –

+0

Können Sie mir sagen, wie Sie Ihr Problem gelöst haben? Ich bekomme nicht viel von den Unterlagen. –

+0

@ JonathanSolorzano, hast du eine Lösung für dein Problem gefunden? –

Antwort

0

Sie Knotenmodul glob benutzerdefinierte Ordner verwenden können, was auch immer Sie

+0

ich verstehe nicht, was du meinst ... –

+0

Dieses Modul hilft Ihnen, Ordner zu analysieren und Datei durch Präfix oder Postfix zu bekommen und Sie können nicht Modelle Datei leicht – trquoccuong

+0

Oh ich sehe, Könnten Sie ein Beispiel dafür geben, wie ich mit der Struktur arbeiten könnte? –

1

Sie mögen alle Modelle lesen aus In Ihrem angegebenen Verzeichnis existieren verschiedene Ordner.

der sortDir Funktion in Modelle/index.js

sortDir die js alle Dateien in jedem Ordner in unserem Verzeichnis in ein Array mit Namen Dateien existieren sortieren lassen hinzuzufügen. Nach dem Aufruf der Funktion können wir unsere Modelle einfach aus dem Datei-Array lesen.

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); 

Jetzt können Sie jedes Modell lesen, nachdem sie von Array-Dateien zu sortieren.

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

Hoffe es hilft!

Verwandte Themen