NodeJs Sequelize 删除 toJSON 方法中的属性会导致模型本身的值被删除
Posted
技术标签:
【中文标题】NodeJs Sequelize 删除 toJSON 方法中的属性会导致模型本身的值被删除【英文标题】:NodeJs Sequelize removing properties in toJSON method leads to removed value from model itself 【发布时间】:2017-01-09 23:02:04 【问题描述】:我有一个 SequelizeInstance 对象,当我将其更改为 JSON 时需要省略一些值,但每当我调用 delete 时,它也会从 SequelizeInstance 中删除该值。下面是代码:
instanceMethods:
toJSON: function()
var values = this.get();
delete values.password;
delete values.salt;
return values;
我面临的问题是,每当我调用 toJSON() 时,SequelizeInstance 都会删除密码和盐的值。我可以做的一个可能的解决方案是做一个对象的浅拷贝并返回它。我想知道是否有其他更好的方法来解决这个问题。
【问题讨论】:
【参考方案1】:直接来自续集issue
password:
// ...
get()
return () => this.getDataValue('password');
作者引用
从 user.password 返回一个函数而不是一个值。它的优点是明确需要 user.password() 调用来检索通行证。普通序列化也会自动避开pass
【讨论】:
【参考方案2】:没错,我都试过了:
const internalObj1 = model.toJSON()
const internalObj2 = model.get( plain: true)
它们都有相同的问题,如果您更改它们中的任何一个,它们都会改变模型引用。
我发现的修复方法是深度克隆它们的值,如下所示: 使用 lodash:
const internalObj1 = _.cloneDeep(model.toJSON());
或使用 es5:
const internalObj2 = Object.assign(, model.toJSON());
或使用 es6:
const internalObj3 = ...model.toJSON();
【讨论】:
【参考方案3】:我喜欢做的是像这样创建一个名为.publicData
的方法
instanceMethods:
publicData: function ()
return
name: this.name,
publicField: this.publicField
// do not add private fields here
它将基本上执行仅包含所需字段的副本。这种方法也很好,因为您不必担心每次添加新私有属性时都更新代码,因为默认情况下它们不会作为公共数据包含在内,您必须手动将它们列入白名单,所以我认为这种方法为安全措施也
【讨论】:
以上是关于NodeJs Sequelize 删除 toJSON 方法中的属性会导致模型本身的值被删除的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SEQUELIZE (nodeJS) 中创建触发器?
NodeJS/Sequelize/MySQL - 为啥需要 postgres 依赖项?
使用 Sequelize (NodeJS) 而不是 * 指定特定字段