Sequelize中Cannot read properties of undefined (reading 'findOne')报错排查
解决Sequelize模型引入后为undefined的问题
你遇到的问题核心是错误地直接解构了Sequelize模型文件的导出内容,具体原因和解决方案如下:
问题根源
你的models/user.js导出的是一个工厂函数,它必须接收sequelize实例和DataTypes作为参数,才能返回真正的user模型对象。而你在index.js里用const { user } = require("../../entities/models/user")尝试解构这个函数——函数本身并没有user这个属性,所以自然得到undefined。
正确解决方案(推荐)
Sequelize项目通常会通过统一入口文件初始化数据库连接并加载所有模型,避免重复初始化和直接调用工厂函数:
- 创建/修改
entities/index.js(统一模型入口):
const Sequelize = require('sequelize'); // 根据你的数据库配置初始化sequelize实例 const sequelize = new Sequelize('database_name', 'username', 'password', { host: 'localhost', dialect: 'mysql' // 替换为你的数据库类型,如postgres、sqlite等 }); // 加载并初始化所有模型 const models = { user: require('./models/user')(sequelize, Sequelize.DataTypes), // 其他模型可在此添加 }; // 执行模型关联逻辑(如果有定义associate方法) Object.values(models).forEach(model => { if (model.associate) { model.associate(models); } }); // 导出sequelize实例和所有模型 module.exports = { sequelize, ...models };
- 在
index.js中通过统一入口引入模型:
const { user } = require("../../entities"); // 路径指向entities/index.js console.log('login 2:', user); const userInfo = await user.findOne({ where: { email: req.body.email, social: 'google'} });
临时解决方案(不推荐)
如果一定要直接引入模型文件,需要手动传入sequelize实例和DataTypes,但这种方式容易导致模型重复初始化,引发不可预期问题:
const sequelize = require('../../entities/sequelize-instance'); // 你的sequelize实例路径 const userFactory = require("../../entities/models/user"); const user = userFactory(sequelize, require('sequelize').DataTypes); // 后续正常使用user模型 const userInfo = await user.findOne({ where: { email: req.body.email, social: 'google'} });
内容的提问来源于stack exchange,提问作者Loolii
相关产品推荐
相关产品推荐

