运行Sequelize模型报sequelize.define() is not a function如何解决
sequelize.define() is not a function 报错修复方案 核心错误点
- 导入写法错误:
Users.js首行的const { sequelize } = require('../index.js').sequelize;属于错误解构。index.js导出的结构是{ sequelize: Sequelize实例 },这行代码先取导出对象的sequelize属性(拿到正确实例),再对实例本身解构取sequelize属性,最终得到undefined,不是可用的Sequelize实例。 - 模型未正确初始化:
Users.js导出的是接收sequelize、DataTypes参数的工厂函数,但你没有在任何位置调用这个函数传入合法参数完成模型初始化,直接引用时拿到的是未执行的函数,自然无法调用define方法。 - 导出逻辑缺失:
index.js只导出了sequelize实例,没有挂载初始化后的模型,其他文件无法正确引用已注册的Users模型。
分步修复
1. 修改Users.js文件
删除首行错误的导入语句,调整为如下代码:
const { DataTypes } = require('sequelize'); module.exports = (sequelize) => { return sequelize.define('users', { user_id: { type: DataTypes.STRING, primaryKey: true, }, balance: { type: DataTypes.INTEGER, defaultValue: 0, allowNull: false, }, }, { timestamps: false, }); };
2. 修改index.js的数据库初始化逻辑
在创建完sequelize实例的代码块后,添加模型初始化、数据库同步逻辑,调整导出内容:
const sequelize = new Sequelize('database', 'user', 'password', { host: 'localhost', dialect: 'sqlite', logging: false, storage: 'database.sqlite', }); // 初始化Users模型,注意路径需匹配你实际存放Users.js的位置 const Users = require('./models/Users')(sequelize); // 同步数据库表,force: false不会覆盖已有数据 sequelize.sync({ force: false }); // 导出实例和模型供其他文件调用 module.exports = { sequelize, Users }; // 后续原有client、事件、命令加载逻辑保持不变即可
提示:如果Users.js和index.js在同一目录,将上面require路径改为
./Users即可。
3. 业务文件引用模型的正确方式
后续在命令、事件文件中需要操作用户货币数据时,直接从index.js导入已初始化的模型即可,示例:
// 按文件实际位置调整相对路径 const { Users } = require('../index.js'); // 后续可直接调用Users.create、Users.findOne等方法操作数据
4. deploy-commands.js无需额外修改
该文件仅负责向Discord接口注册斜杠命令,本身不涉及数据库操作,不需要引入Sequelize或模型文件,保持原有逻辑即可。修复完成后再运行不会触发该报错。
内容的提问来源于stack exchange,提问作者zuoelu
相关产品推荐
相关产品推荐

