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

发布于 2022-09-12 23:34:23 字数 1550 浏览 40 评论 0

如题,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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无尽的现实 2022-09-19 23:34:23

查看了官方文档,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
      })
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文