sequelize hook 设置自定义字段不生效

sole
  • 247

如题,koa使用了sequelize数据库orm,定义好模型后,也定义了一个hook,来设置自定义的时间戳字段;
数据可以正常添加,更新;

问题:在添加的时候,创建时间 和 更新时间会报道数据库,但是更新操作 创建时间 和 更新时间 就不会自动更新,很奇怪,不知道为什么。

定义好的模型:

module.exports = (app) => {
    const { sequelize, Sequelize } = app;

    const fields = {
        id: {
            type: Sequelize.INTEGER,
            autoIncrement: true,
            allowNull: false,
            primaryKey: true,
            unique: true,
        },
        name: {
            type: Sequelize.STRING(16),
            allowNull: false,
            comment: '名称',
        },
        createdAt: {
            type: Sequelize.STRING(15),
            defaultValue: Date.now(),
            comment: '创建时间',
        },
        updatedAt: {
            type: Sequelize.STRING(15),
            defaultValue: Date.now(),
            comment: '更新时间',
        },
    };

    const config = {
        timestamps: false,
        hooks: {
            beforeValidate(obj) {
                let now = Date.now();
                // 如果id存在说明是更新操作
                if (obj.dataValues.id) {
                        // 这里没有执行,数据库也未更新
                    obj.updatedAt = now;
                } else {
                    obj.createdAt = now;
                    obj.updatedAt = now;
                }
            },
        },
    };

    return sequelize.define('tem', fields, config);
};

添加操作

this.models.tem.create(data)

更新操作

this.models.tem.update(data)
回复
阅读 694
1 个回答

查看了官方文档,isNewRecord 不代表是否是添加和修改的标识。如果想在修改或增加前做动作,要写下面两个钩子:

hooks: {
      beforeCreate(instance, options) {
        if (!instance.id) {
          instance.id = generateId()
        }
        const now = Date.now()
        instance.createAt = now
        instance.updateAt = now
      },
      beforeUpdate(instance) {
        instance.updateAt = Date.now()
      }
    }

有一点需要注意:必须要设置individualHooks: true

return await myTest.update(
      { testName: 'xxxx' },
      {
        where: {
          id: '567f41c4ceb7447aacf5900b07dde205'
        },
        individualHooks: true
      })
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏