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) 而不是 * 指定特定字段

在nodejs sequelize中循环获取异步数据

nodejs + sequelize :: 在需要的地方包含 false

Nodejs ORM框架Sequelize快速入门