Discuss / JavaScript / isNewRecord 一直是true,而且这里的id也一直是默认是为null

isNewRecord 一直是true,而且这里的id也一直是默认是为null

Topic source

这个isNewRecord很有歧义,再官网上看了好久,才找出来一个比较好的解决方案。 推送一下廖大github pr

小火Ciel

#2 Created at ... [Delete] [Delete and Lock User]

请问 怎么解决的?

笨二CHINA

#3 Created at ... [Delete] [Delete and Lock User]

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

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

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

individualHooks: true
beforeUpdate钩子才会生效
return await myTest.update(
      { testName: 'xxxx' },
      {
        where: {
          id: '567f41c4ceb7447aacf5900b07dde205'
        },
        individualHooks: true
      })

笨二CHINA

#4 Created at ... [Delete] [Delete and Lock User]
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()
      }
    }

抱歉,beforeUpdate 没有写完整

friendlysxw

#5 Created at ... [Delete] [Delete and Lock User]

这显然是个属性而非方法,廖老湿可能没注意,改成属性访问就行

isNewRecord官方记载:https://sequelize.org/v3/api/instance/#isnewrecord-boolean

friendlysxw

#6 Created at ... [Delete] [Delete and Lock User]
        hooks: {
            beforeValidate: function(obj) {
                let now = Date.now();
                if (obj.isNewRecord) {
                    if (!obj.id) {
                        obj.id = generateId()
                    }
                    obj.createAt = now;
                    obj.updateAt = now;
                    obj.version = 0;
                }else {
                    obj.updateAt = Date.now();
                    obj.version++;
                }
                
            }
        }

  • 1

Reply