使用SequelizeJS定义模型遇类型错误:ArticleCategoryModel不是函数
解决Sequelize关联时的TypeError: ArticleCategoryModel is not a function
这个错误我之前也碰到过,核心原因是你对ArticleCategoryModel的调用方式和它的导出形式不匹配,咱们一步步来解决:
错误根源分析
你在ArticleModel.js里尝试调用ArticleCategoryModel(),但Node.js提示它不是函数——这说明你引入的ArticleCategoryModel要么是已经初始化好的模型实例,要么是它的导出方式和你预期的不一样。
两种常见修正方案
方案一:如果ArticleCategoryModel是导出的初始化函数
如果你的ArticleCategoryModel.js和ArticleModel.js一样,是导出一个接收sequelize参数的函数,那你需要确保调用时传入正确的sequelize实例:
首先检查ArticleCategoryModel.js的导出是否正确:
// ArticleCategoryModel.js var Sequelize = require('sequelize'); // 导出一个接收sequelize的函数,返回定义好的模型 module.exports = function(sequelize) { return sequelize.define('articleCategory', { name: { type: Sequelize.STRING } // 其他字段定义 }, { freezeTableName: true }); };
然后在ArticleModel.js里补全调用参数:
// ArticleModel.js var Sequelize = require('sequelize'), ArticleCategoryModel = require('./ArticleCategoryModel'); module.exports = function(sequelize) { var Article = sequelize.define('article', { title: { type: Sequelize.STRING }, content: { type: Sequelize.TEXT } }, { freezeTableName: true }); // 传入sequelize实例,获取正确的模型类 Article.belongsTo(ArticleCategoryModel(sequelize)); return Article; };
方案二:如果ArticleCategoryModel是已初始化的模型实例
如果ArticleCategoryModel.js已经直接导出了初始化好的模型(比如它自己创建了sequelize实例),那你不需要把它当函数调用,直接使用即可:
检查ArticleCategoryModel.js的导出:
// ArticleCategoryModel.js var Sequelize = require('sequelize'); // 直接创建sequelize实例 var sequelize = new Sequelize('your_db', 'user', 'password', { /* 配置 */ }); var ArticleCategory = sequelize.define('articleCategory', { name: { type: Sequelize.STRING } }, { freezeTableName: true }); // 直接导出模型实例 module.exports = ArticleCategory;
然后修改ArticleModel.js的关联代码:
// ArticleModel.js var Sequelize = require('sequelize'), ArticleCategoryModel = require('./ArticleCategoryModel'); module.exports = function(sequelize) { var Article = sequelize.define('article', { title: { type: Sequelize.STRING }, content: { type: Sequelize.TEXT } }, { freezeTableName: true }); // 直接使用已初始化的模型,无需调用函数 Article.belongsTo(ArticleCategoryModel); return Article; };
推荐的最佳实践
为了避免这类导出/调用不匹配的问题,建议创建一个统一的模型索引文件,集中管理所有模型的初始化和关联:
// models/index.js var Sequelize = require('sequelize'); // 在这里统一创建sequelize实例 var sequelize = new Sequelize('your_db', 'user', 'password', { host: 'localhost', dialect: 'mysql' // 或你使用的数据库类型 }); // 初始化所有模型 var models = { Article: require('./ArticleModel')(sequelize), ArticleCategory: require('./ArticleCategoryModel')(sequelize) }; // 集中设置关联关系 models.Article.belongsTo(models.ArticleCategory); module.exports = { sequelize: sequelize, models: models };
这样在项目其他地方使用模型时,只需要引入这个索引文件即可,再也不用担心关联时的函数调用错误了。
内容的提问来源于stack exchange,提问作者tonymx227
相关产品推荐
相关产品推荐

