使用Sequelize.import时定义模型的顺序

我现在使用Sequelize,一个node.js orm。 根据这个例子,我的代码如下:

module.exports = function(callback){

var fs = require('fs'); var path = require('path'); var Sequelize = require('sequelize'); var logger = require(path.join(__dirname, '../logger/logger.js')); var settings = JSON.parse(fs.readFileSync(path.join(__dirname, '../../config/settings.json'), 'utf8')); var dbConnectionInfo = require(path.join(__dirname, '../../lib/util/dbConnectionInfo.js'))(settings.dbUri); var sequelize = new Sequelize(dbConnectionInfo.dbUri,{logging:false}); sequelize.authenticate() .then(function() { if (callback) { callback(); } }) .catch(function(error) { logger.error('DB Connection failed ', error); if (callback) { callback(error); } }); var db = {}; fs .readdirSync(__dirname) .filter(function(file) { return file.indexOf('.') !== 0 && file !== 'index.js'; }) .forEach(function(file) { var model = sequelize.import(path.join(__dirname, file)); db[model.name] = model; }); db.sequelize = sequelize; return db; } 

该代码将加载“model”文件夹中的所有文件。 问题是有一个模型A参考模型B如下所示:

 var A = function(sequelize, DataTypes) { return sequelize.define('A', { serviceInstanceId: { type: DataTypes.STRING, field: 'b_id', allowNull: false, references: { model: B, key: "b_id", deferrable: sequelize.Deferrable.INITIALLY_IMMEDIATE } }, }); }; 

但是我发现当模型A正在初始化的时候,会试着find模型B,现在模型B没有加载。 那么有没有办法可以确保当它试图加载A时,B会先加载?

当你在单独的文件中定义模型时,我不认为你可以定义这样的关联。 您必须首先导入所有模型,一旦导入了所有模型,您就可以运行关联逻辑。

如何做到这一点有几种方法,但常用的和我使用的方法是定义associate类的方法处理关联的模型。

模型A.

 module.exports = function (sequelize, DataTypes) { var A = sequelize.define('A', {}, { classMethods: { associate: function (models) { A.belongsTo(models.B, {foreignKey: 'b_id'}); } } }); return A; }; 

模型B

 module.exports = function (sequelize, DataTypes) { var B = sequelize.define('B', {}, { classMethods: { associate: function (models) { B.hasMany(models.A, {foreignKey: 'b_id'}); } } }); return B; }; 

一旦你有这样的模型声明,所有的模型已经被导入,你可以调用模型的associate函数。

 Object.keys(db).forEach(function (modelName) { if ("associate" in db[modelName]) { models[modelName].associate(db); } }); 

这可以放置在索引文件的导入逻辑之后。