我正在做一个快速续集项目。
我在续集方面遇到问题。
我有一个简单的架构,如文档所述:
class Task extends Model {}
Task.init({ title: Sequelize.STRING }, { sequelize, modelName: 'task' });
class User extends Model {}
User.init({ username: Sequelize.STRING }, { sequelize, modelName: 'user' });
User.hasMany(Task); // Will add userId to Task model
Task.belongsTo(User); // Will also add userId to Task model
但是当我用include查询时
sequelize.models['task'].findAll({include:[{all:true}]});
我面临一些问题:
第一个:
this._getIncludedAssociation is not a function
以下是github源代码:https://github.com/sequelize/sequelize/blob/master/lib/model.js#L615
我只是将this
更改为Model
进行检查。
该错误消失了,但是出现了第二个错误(与第一个错误有关,因为我更改了行为)
User is not associated to Model
但是应该说User is not associated to Task
(错误的github:https://github.com/sequelize/sequelize/blob/master/lib/model.js#L711)
就像Model并没有实例化...
我的代码中可能有什么不好的地方?也许事实是通过sequelize.models[modelName]
来调用模型?我为此苦了很长时间...
谢谢。
更多信息:
序列化版本:^ 5.7.0
建筑:
在应用程序启动时,我所有的模型都存储在我的流程中存储的自定义数据库类中。
在任何控制器内部,我都调用一个存储库类,例如,使用类似下面的方法的方法,其中可以通过this.model
访问所需的模型:
findAll(options, force = false) {
let data = this.performExtraOptions(options);
data.paranoid = force;
if (this.isDebug) {
this.req.debug.addDatabaseCall('Table ' + this.model.getTableName() + ' findAll', data);
}
return this.model.findAll(data);
}
当我使用Chrome调试器进行检查时,模型显示如下:
const model = class extends Model {};
答案 0 :(得分:1)
好的。
在阅读续集代码时,我发现算法内部需要options.model
。
问题是我也通过查询选项发送了模型,但以模型名称(字符串)的形式发送了。
算法,将option.model转换为Model
的实例对象以进行处理。
所以我只需要重命名作为查询选项传递的变量。
这行代码就是问题所在: https://github.com/sequelize/sequelize/blob/master/lib/model.js#L493
if (!options.model) options.model = this;