2015-09-13 2 views
6

Мой настоящий вопрос: возможно ли работать с sequelize с моделями в отдельных папках?Модифицировать модели в отдельных папках

Я прошу об этом, потому что я пытаюсь работать с модульной структурой в своем приложении, чтобы добиться того, что мне нужно иметь модель, контроллер и маршруты в одной и той же папке, вот что я имею в виду:

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

Как я мог это сделать? как можно разделить модели на отдельные папки?

Возможно, что я прошу: как я могу настроить сценарии models/index.js для чтения моделей из каждой директории?

модель/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; 

Что-то я думал, чтобы искать xxx.model.js по каждой папке из модулей каталога, имеющая структуру, как это:

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 
| └── ... 
└── ... 

ПРИМЕЧАНИЕ: Я исхожу из фона Laravel, я угадываю, как миграции и модели различаются в последующем, поскольку, когда вы определяете Определим модель вы говорите тип и т.д .. колонки, такой же, как миграция ...

+0

Большинство моих вопросов были разрешены с помощью [docs] (https://github.com/sequelize/cli#options), но не с разбиением папки с образцами –

+0

Не могли бы вы рассказать мне, как вы решили свою проблему? Я не получаю много внимания от документов. –

+0

@JonathanSolorzano, вы нашли решение проблемы? –

ответ

0

Вы можете использовать модуль узла glob пользовательскую папку все, что вам нравится

+0

Я не понимаю, что вы имеете в виду ... –

+0

Этот модуль поможет вам проанализировать папку и получить файл с помощью префикса или постфикса, и вы не можете легко получить файлы моделей – trquoccuong

+0

О, я вижу, вы могли бы привести пример того, как я могу работать с ним, используя структуру? –

1

Вы должны прочитать все модели от в вашей директории существуют разные папки.

Давайте добавим sortDir функцию в модели/index.js

sortDir будет сортировать все файлы JS существуют в каждой папке, которую мы имеем в нашем каталоге в массив называется файлов. После вызова функции мы можем легко прочитать наши модели из массива файлов.

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

Теперь вы можете прочитать каждую модель после сортировки их из файлов массивов.

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

Надеюсь, это поможет!

Смежные вопросы