У меня есть сценарий миграции Sequelize (созданный из исходного сценария миграции sequelize-cli сгенерированного при запуске sequelize-cli ), который динамически создает таблицы на основе списка из ~ 100 жестко закодированных имен таблиц, импортированных из файла .json. Таким образом, будет утомительно и подвержено ошибкам кодировать определения модели Sequelize вручную.

Вопрос: Как мы можем динамически генерировать модели Sequelize, читая из того же файла .json? Я в основном застрял, как мы должны возвращать несколько моделей module.exports , используя module.exports , на основе файла определения модели, автоматически сгенерированного из запущенной sequelize-cli model:generate --name Base ... Похоже, существует специальный скрипт models/index.js для чтения файла определения models/base.js

Модели / base.js

 'use strict'; const universe = require('../config/universe.json'); const generateModel = (sequelize, DataTypes, tableName) ={amp}gt; { const schema = { name: DataTypes.STRING, power: DataTypes.DOUBLE, }; const options = { timestamps: false, }; const Model = sequelize.define(tableName, schema, options); Model.associate = function(models) { // associations can be defined here } return Model; } module.exports = (sequelize, DataTypes) ={amp}gt; { models = [] for (let planet in universe) { for (const species of universe[planet]) { models.push(generateModel(species)); } } return models; }; 

app.js

Попытка загрузить динамически созданную модель Human

 const Human = require('./models').base.human; Human.create({name: 'Tom', power: 1.23}); 

конфиг / universe.json

Пример файла жестко закодированных данных

 { "earth": [ 'human', 'cat', 'dog' ] } 

Модели / index.js

Этот файл генерируется автоматически после запуска sequelize-cli init

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