Sequelize调用create方法报错Cannot read property 'create' of undefined如何解决
问题原因
- 你定义的模型模块导出的是接收
sequelize、DataTypes两个入参的工厂函数,路由中直接require('../models/Problems')拿到的是未执行的函数本身,不是初始化完成的Sequelize模型实例,不存在create方法,调用时就会抛出该错误。 - 你没有提前初始化Sequelize数据库连接实例,也没有完成模型的注册流程。
解决方案
方案1:统一注册模型(推荐)
在models目录下新建index.js作为模型统一注册入口,代码如下:
const Sequelize = require('sequelize'); // 替换为你自己的数据库连接配置 const sequelize = new Sequelize('数据库名称', '数据库账号', '数据库密码', { host: '127.0.0.1', dialect: 'mysql' // 根据实际使用的数据库类型调整,可选postgres、mariadb、sqlite等 }); const db = {}; // 传入实例完成模型初始化 db.Problems = require('./Problems')(sequelize, Sequelize.DataTypes); db.sequelize = sequelize; db.Sequelize = Sequelize; module.exports = db;
修改路由文件的模型导入逻辑:
// 从统一注册入口导入已初始化的模型 const { Problems } = require('../models');
方案2:路由内直接初始化(仅测试用)
直接修改路由文件的导入部分,手动完成模型初始化:
const Sequelize = require('sequelize'); // 初始化数据库连接 const sequelize = new Sequelize('数据库名称', '数据库账号', '数据库密码', { host: '127.0.0.1', dialect: 'mysql' }); // 执行模型工厂函数拿到可用的模型实例 const Problems = require('../models/Problems')(sequelize, Sequelize.DataTypes);
额外注意
你当前模型代码中sequelize.define("Posts", { ... })第一个参数为Posts,Sequelize默认会自动生成复数形式的表名posts,如果你期望表名和模型名匹配,可修改第一个参数为Problem,或在define的第三个参数中手动指定表名:
sequelize.define("Posts", { // 字段定义不变 }, { tableName: 'problems' // 手动指定实际表名 })
内容的提问来源于stack exchange,提问作者Никита Шапаренко
相关产品推荐
相关产品推荐

