Sequelize defaultValue 未设置

Sequelize defaultValue not getting set

这是我的食谱模型 table。我使用 mysql 作为数据库和 sequelize 模块。如果我在表单中将标题 prep_time 或 cook_time 留空,它似乎会跳过 allowNull 和 defaultValue 的验证并尝试在数据库中输入 ''(空白字符串)。我做错了什么吗?

module.exports = function(sequelize, DataTypes) {
    return sequelize.define('recipe', {
        title: {
            type: DataTypes.STRING,
            allowNull: false
        },
        description: {
            type: DataTypes.TEXT
        },
        ingredients: {
            type: DataTypes.TEXT
        },
        instructions: {
            type: DataTypes.TEXT
        },
        yield: {
            type: DataTypes.STRING
        },
        prep_time: {
            type: DataTypes.INTEGER,
            allowNull: false,
            defaultValue: '0'
        },
        cook_time: {
            type: DataTypes.INTEGER,
            allowNull: false,
            defaultValue: '0'
        },
        image: {
            type: DataTypes.STRING
        }
    });
};

这可能发生在两种情况下。首先,如果您在定义模型后输入了 defaultValueallowNull,那么您需要将 table 与 sync({force: true).

重新同步

其次,如果 title 和 prep_time 等属性未提供给 create()AllowNulldefaultValue 将起作用。例如 create({title:'',prep_time:''}) 将填充空值。但是,如果您执行 create({title:''},则 prep_time 的值将设置为 defaultValue。类似地跳过 title 属性将导致验证错误。

但是如果你正在做 create(req.body) 并且 body 有字段 titleprep_time。然后将输入空值。

希望我说清楚了:)

我知道这个问题是几年前的事了。但是,这可能对其他人有帮助。在这种情况下,它应该使用 Sequelize 的 validate notEmpty。因为HTML表单默认传入not null(空字符串或''或""或``),所以不需要使用validate notNull.

在这里,我推荐大家阅读这篇文章: https://sequelize.org/master/manual/validations-and-constraints.html

Sequelize会按顺序检查:

  1. 自定义验证
  2. 内置验证
  3. 约束