【问题标题】:sequelize ignore "save()" method on JSON objectsequelize 忽略 JSON 对象上的“save()”方法
【发布时间】:2021-01-14 10:29:34
【问题描述】:

我正在尝试利用模型实例方法,如 doc 中所述。所以我定义User类如下:

class User extends Model {
    addRole(role){
        let roles = this. roles;
        roles[role] = true;
        this.roles = roles;
        this.save();
    }

    removeRole (role) {
        let roles = this.roles;
        delete roles[role];
        this.save();
    }
    
    hasRole (role){
        return this.roles[role] != null;
    }
}


User.init({
// some attributes
,
roles:{
  type: DataTypes.JSON,
  allowNull: false,
}
}, { sequelize});

我希望在任何User 实例中使用方法addRole()removeRole()hasRole()

所有方法无法将其更改保存到数据库的问题。 (只能阅读!)

// example 
let user = null; 
// get the first user to test.
User.findAll() 
    .then(users =>{
          user = users[0];
          user.addRole("admin");
          console.log(user.roles); // {admin: true} 
          user.save();
          // However the changes don't appear in the database.
}); 

【问题讨论】:

    标签: javascript node.js sqlite sequelize.js


    【解决方案1】:

    我找到了答案。 由于某些原因,sequelise 无法正确检测到 json 对象的变化。由于 sequelise 在内部进行了优化,如果模型没有更改,则忽略对 model.save() 的调用。所以,sequelize 随机忽略save 方法。

    当我第一次遇到这个问题时,我相信这种行为与实例方法无关。

    为了摆脱这个问题,我不得不使用:

     user.addRole("admin");
     user.changed("roles", true); // <<<< look at this;
     console.log(user.roles); // {admin: true} 
     user.save();
    

    请注意,当手动编辑来自嵌套(例如 JSON)属性的属性时,此函数将返回 false,在这些情况下您必须手动调用 changed('key', true)。将检测到写入一个全新的对象(例如深度克隆)。

    例子:

    const mdl = await MyModel.findOne();
    mdl.myJsonField.a = 1;
    console.log(mdl.changed()) => false
    mdl.save(); // this will not save anything
    mdl.changed('myJsonField', true);
    console.log(mdl.changed()) => ['myJsonField']
    mdl.save(); // will save
    

    changed method usage

    【讨论】:

      猜你喜欢
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      相关资源
      最近更新 更多