Postgres中Include语句抛出SequelizeEagerLoadingError错误求助
我来帮你排查这个SequelizeEagerLoadingError的问题——这个错误几乎都是因为模型关联配置不匹配导致的,结合你提供的代码,我们可以从以下几个关键点逐一排查:
1. 检查模型间的关联定义是否正确
首先要确保User模型和subscribedcurrency模型已经通过Sequelize的关联方法(比如hasOne/belongsTo/hasMany)建立了正确的关系,并且关联的as别名要和你include里的完全一致。
举个例子,如果是User拥有一个订阅货币记录,你的User模型里应该有类似这样的代码:
// 先引入对应的订阅货币模型 const SubscribedCurrency = require('./subscribedcurrency.model'); // 定义关联,注意as的取值要和include里的完全匹配(包括空格) User.hasOne(SubscribedCurrency, { as: 'subscribed currency', foreignKey: 'user_token_id', // 替换成你数据库中实际的外键字段 sourceKey: 'token_id' // 因为你查询User用的是token_id,说明这是User的主键,需要指定sourceKey });
如果是订阅货币属于某个用户,那在SubscribedCurrency模型里应该写:
const User = require('./user.model'); SubscribedCurrency.belongsTo(User, { as: 'subscribed currency', foreignKey: 'user_token_id', targetKey: 'token_id' });
2. 确认include中引用的模型变量正确
你代码里写的是model: subscribedcurrency,这里要注意:Sequelize的模型通常是首字母大写的变量(比如你定义模型时可能写的是const SubscribedCurrency = sequelize.define('subscribedcurrency', {...})),所以include里必须使用正确的模型变量名,而不是小写的表名。
修正后的控制器代码应该是这样:
// 先引入正确的模型 const User = require('../models/user.model'); const SubscribedCurrency = require('../models/subscribedcurrency.model'); retrieve (req, res) { return User .findOne({ where: { token_id: req.params.token_id }, include: [{ model: SubscribedCurrency, // 使用正确的模型变量 as: 'subscribed currency' // 和关联定义一致的别名 }] }) .then(user => { if (!user) { return res.status(404).send({ message: 'User Not Found' }) } return res.status(200).send(user) }) .catch(error => res.status(400).send(error)) }
3. 验证外键与主键的匹配
如果你的User表主键不是默认的id(而是token_id),一定要在关联定义中指定sourceKey(对于hasOne/hasMany)或targetKey(对于belongsTo),否则Sequelize会默认用id去关联,导致找不到对应的关联字段。
另外,要确保subscribedcurrency表中存在对应的外键字段(比如user_token_id),并且这个字段的值确实关联到User表的token_id。
4. 检查别名的一致性
include中的as值必须和关联定义中的as值完全一致,包括空格、大小写——比如你写的是'subscribed currency',关联定义里就不能写成'subscribedCurrency'或者'subscribed_currency',哪怕只是格式不同都会触发这个错误。
内容的提问来源于stack exchange,提问作者Ricky

