gpt4 book ai didi

javascript - sequelize 忽略 JSON 对象上的 "save()"方法

转载 作者:行者123 更新时间:2023-12-03 22:32:18 25 4
gpt4 key购买 nike

我正在尝试利用模型实例方法的好处,如 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});
我希望在任何 addRole() 实例中使用 removeRole()hasRole()User 方法。
所有方法都无法将更改保存到数据库的问题。 (只能读取!)
// 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.
});

最佳答案

我已经找到了答案。
由于某些原因,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();

Please note that this function will return false when a property from a nested (for example JSON) property was edited manually, you must call changed('key', true) manually in these cases. Writing an entirely new object (eg. deep cloned) will be detected.


Example:

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

关于javascript - sequelize 忽略 JSON 对象上的 "save()"方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65693880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com