Sequelize报No Sequelize instance passed错误如何排查
问题根因
两个报错分别对应独立的代码问题:
- 第一个
TypeError: Cannot read property 'create' of undefined报错:你的User模型采用工厂函数形式导出(导出内容是需要传入sequelize实例、DataTypes才能返回模型类的函数),直接require("../models/User")拿到的是工厂函数本身,不是包含User属性的对象,解构得到的User值为undefined,调用create方法自然报错。 - 第二个
No Sequelize instance passed报错:Sequelize模型初始化的init方法第二个配置参数,要求必须传入**小写键名sequelize**指向数据库实例,你在User.js中写的是大写开头的Sequelize作为配置键,Sequelize识别不到传入的实例,因此抛出该错误。
额外问题:你修改完models/index.js之后,控制器里的模型引入路径没有同步修改,还是错误的直接引入User.js文件的写法。
修复步骤
按顺序修改以下3处代码即可解决问题:
- 修改
models/User.js的模型初始化配置,修正sequelize实例的键名,同时给id字段补充主键约束、修正password字段的非空配置 - 修改
controllers/user.js的模型引入路径,从models目录入口文件引入已注册的模型 - 删除测试用的主动抛错逻辑,避免接口正常创建用户后仍返回错误
修正后代码片段
models/User.js
const { Model } = require("sequelize"); // 形参第一个是sequelize实例,第二个是DataTypes,统一小写命名避免和Sequelize类混淆 module.exports = (sequelize, DataTypes) => { class User extends Model { toJSON() { return { ...this.get(), password: undefined, }; } } User.init( { // 补充primaryKey主键约束 id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true }, nom: { type: DataTypes.STRING, allowNull: false }, prenom: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, validate: { notNull: true, notEmpty: true, isEmail: true }, }, status: { type: DataTypes.STRING, allowNull: false }, // Sequelize非空约束用allowNull,原写法required是Mongoose的语法 password: { type: DataTypes.STRING, allowNull: false }, }, // 配置键名必须为小写sequelize,指向传入的数据库实例 { sequelize, tableName: "users", modelName: "User" } ); return User; };
controllers/user.js
/*const bcrypt = require("bcrypt"); const jwt = require("jsonwebtoken");*/ // 从models入口引入已完成注册的模型 const { User } = require("../models"); module.exports.signup = async (req, res) => { try { const user = await User.create({ nom: "Jp", prenom: "remy", email: "remy@gmail.fr", password: "motdepasse", }); // 删除测试用的主动抛错逻辑,正常返回创建结果 res.status(201).json({ user }); } catch (erreur) { console.log(erreur); res.status(400).json({ erreur: erreur.message }); } };
验证方式
修改完成后重启Node服务,控制台先打印Connection has been established successfully!数据库连接成功日志,再请求/signup接口即可正常创建用户,不会再抛出上述两个报错。
内容的提问来源于stack exchange,提问作者Elodie Jean
相关产品推荐
相关产品推荐

