Sequelize报TypeError: hasOne is not a function 无法生成外键如何解决
问题原因和修复方案
1. 直接报错原因:未保存模型工厂的返回值
你导出的dealer-model.js、dealer-products-model.js都是工厂函数,调用后返回的才是Sequelize模型实例,你在index.js里只是执行了函数没有赋值,此时的DealerProduct、Dealer都是普通函数对象,自然没有hasOne、belongsTo这类模型专属方法。
2. 外键生成失败原因:关联方向配置错误
外键存放在哪张表,哪张表的模型就要调用belongsTo关联父表:你希望外键dealers_did生成在dealer_products表,就应该是DealerProduct从属Dealer,你当前的配置是把外键放到dealers表,自然不会在产品表生成外键。
3. 隐藏问题:模型引入路径错误
你dealer模型的文件名是dealer-model.js,但index.js里引入的是./dealers-model,多了s后缀,会导致模块引入失败。
修复后的index.js代码
module.exports = async (sequelize = require('../db')) => { const { DataTypes } = require('sequelize'); // 修正引入路径 const User = require('./user-model'); const Dealer = require('./dealer-model'); const DealerProduct = require('./dealer-products-model'); // 保存初始化后的模型实例 const UserModel = User(sequelize) const DealerModel = Dealer(sequelize) const DealerProductModel = DealerProduct(sequelize) // 修正关联方向,外键将生成在dealer_products表 DealerModel.hasOne(DealerProductModel, { foreignKey: { type: DataTypes.UUID, allowNull: false, name: "dealers_did" } }); DealerProductModel.belongsTo(DealerModel, { foreignKey: "dealers_did" }); // 异步sync方法加await避免时序问题 await sequelize.sync({alter: true}); }
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

