NodeJs Sequelize删除toJSON方法中的属性会导致从模型本身移除值

时间:2016-09-01 23:00:15

标签: json node.js sequelize.js

我有一个SequelizeInstance对象,当我将其更改为JSON时,我需要省略一些值,但每当我调用 delete 时,它也会从SequelizeInstance中删除该值。以下是代码:

instanceMethods: {
        toJSON: function() {
            var values = this.get();
            delete values.password;
            delete values.salt;
            return values;
        }
    }

我面临的问题是每当我调用toJSON()时,SequelizeInstance都会删除password和salt的值。我可以做的一个可能的解决方案是做一个对象的浅表副本并返回它。我想知道还有其他更好的方法可以解决这个问题。

3 个答案:

答案 0 :(得分:0)

我喜欢做的是创建一个名为.publicData的方法,就像这样

instanceMethods: {
    publicData: function () {
        return {
            name: this.name,
            publicField: this.publicField
            // do not add private fields here
        }
    }
}

它基本上会执行仅包含所需字段的副本。这种方法也很好,因为每次添加新的私有属性时都不必担心更新代码,因为默认情况下它们不会作为公共数据包含在内,您必须手动将其列为白名单,因此我将此方法视为安全措施也是

答案 1 :(得分:0)

这是正确的我试过了两个:

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()};

答案 2 :(得分:0)

直接来自后继器issue

password: {
    // ...
    get() {
        return () => this.getDataValue('password');
    }
}

作者报价

  

从user.password返回函数而不是值。优点是明确需要user.password()调用来获取通行证。通行证也将通过普通序列化自动规避