Express JS搭配Sequelize连接MSSQL 报读取undefined的findAll属性错误
问题根因
报错Cannot read properties of undefined (reading 'findAll')是因为控制器中模型引入逻辑完全错误,拿到的invitesModel值为undefined,自然无法调用Sequelize模型的findAll方法。
具体错误点
- 引入路径错误:控制器中写的
require('../models/Invites')指向的是单个模型定义文件,该文件导出的是需要传入sequelize连接实例才能执行的工厂函数,不是已经完成初始化的可用模型实例。 - 解构变量名不匹配:项目的模型聚合入口
/models/index.js中,注册到导出对象的模型名是Invites(和sequelize.define传入的第一个参数完全一致,首字母大写),根本不存在invitesModel这个导出属性。
修复方案
1. 修正控制器的模型引入代码
删除控制器中原有的错误引入逻辑,改为从模型统一聚合入口引入已初始化完成的模型,修改后的完整控制器代码如下:
// 从模型聚合入口引入,路径指向models目录会自动读取该目录下的index.js const { Invites } = require('../models'); const getAllInvites = (req, res) => { // 调用正确的模型实例方法 Invites.findAll().then((invites) => { res.send(invites); }).catch((err) => { console.log(err); // 补全错误响应,避免接口挂起 res.status(500).send({msg: '查询邀请列表失败', error: err.message}) }) }; module.exports = { getAllInvites, }
注意:所有业务代码需要使用模型时,都要从
/models/index.js聚合入口引入,不要直接引用单个模型定义文件。单个模型文件导出的工厂函数已经在聚合入口统一传入sequelize实例完成了初始化,直接引单文件拿到的不是可用模型。
2. 可选校验步骤
如果修改后仍有异常,可以在项目入口index.js中加一行打印,确认模型是否正常注册:
const db = require('./models'); // 打印已注册的模型列表,正常输出应该包含Invites字段 console.log('已注册模型:', Object.keys(db).filter(key => !['sequelize', 'Sequelize'].includes(key)));
其他注意事项
- Sequelize注册模型时默认使用
sequelize.define传入的第一个参数作为对象key,引入时注意大小写匹配,不要把大写开头的Invites写成小写开头的变量名。 - 原控制器的catch逻辑只打印了错误日志,没有给前端返回响应,会导致请求一直挂起,建议所有接口都补全错误分支的响应逻辑。
内容的提问来源于stack exchange,提问作者It hurts when IP
相关产品推荐
相关产品推荐

