gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 23:52:36 24 4
gpt4 key购买 nike

我现在正在使用 Sequelize,一个 node.js orm。根据示例,我有如下代码:

module.exports = 函数(回调){

  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在初始化的时候会尝试寻找模型B,现在模型B没有加载。那么有没有一种方法可以确保当它尝试加载 A 时, B 将首先加载?

最佳答案

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

有几种方法可以做到这一点,但常见的一种方法是为处理关联的模型定义 associate classMethod。

模型 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);
}
});

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

关于node.js - 使用 Sequelize.import 时定义模型的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38215529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com