Sequelize插入含模型未定义字段的数据未报错,求配置解决方法
解决Sequelize插入未定义字段不报错的问题
这个场景我太熟悉了!Sequelize默认情况下会自动忽略模型中未定义的字段,不会抛出任何错误——这就是你插入带sessionID的数据却没收到报错的核心原因。它的设计初衷是让开发者更灵活地处理数据,但如果需要严格校验字段合法性,就需要调整配置。
原因解析
Sequelize 5.x的默认行为是宽松模式:当你调用create()、update()等方法时,会自动过滤掉模型init中未声明的属性,直接插入/更新已定义的字段,不会对未知字段做校验或报错。
解决方案
你有三种方式开启严格校验,根据需求选择即可:
1. 单个模型开启严格模式
直接在你的ResploginSchema模型的配置中添加strict: true,这样只有该模型会拒绝未知字段:
class ResploginSchema extends Sequelize.Model { } ResploginSchema.init( { resploginID: { type: Sequelize.BIGINT(20).UNSIGNED, autoIncrement: true, primaryKey: true, allowNull: false }, clientID: { type: Sequelize.INTEGER(10).UNSIGNED, allowNull: false, validate: { isNumeric: true } }, tablelimitID: { type: Sequelize.TINYINT(2).UNSIGNED, allowNull: false }, errMsgID: { type: Sequelize.INTEGER(6).UNSIGNED, allowNull: false } }, { sequelize: dbConnection, modelName: "resplogin", freezeTableName: true, timestamps: false, strict: true // 开启严格模式 } );
2. 单个操作开启严格模式
如果只需要对某一次create/update操作做校验,可以在方法的第二个参数中传入strict: true:
let data = { clientID: 1, sessionID: "not defined field", tablelimitID: 1, errMsgID: 0 }; ResploginSchema.create(data, { strict: true }) .then(() => console.log("插入成功")) .catch(err => { console.error("插入失败:", err); // 这里会抛出错误,提示sessionID不是模型的属性 });
3. 全局开启严格模式
如果你希望所有模型都启用严格校验,可以在创建Sequelize连接实例时设置全局配置:
const sequelize = new Sequelize(database, username, password, { host: 'localhost', dialect: 'mysql', // 替换为你的数据库类型 define: { strict: true // 全局启用严格模式 } });
关于strict选项的取值说明
Sequelize 5.x中strict支持三种取值:
true/'throw': 遇到未知字段时直接抛出错误(符合你的预期)'warn': 控制台输出警告信息,但不会终止操作false: 忽略未知字段(默认行为)
这样调整后,当你再插入包含未定义字段的数据时,就会收到预期的错误提示了!
内容的提问来源于stack exchange,提问作者Oli Soproni B.
相关产品推荐
相关产品推荐

