Sequelize POJO JSON.stringify魔术如何运作?

时间:2017-01-19 17:16:33

标签: node.js sequelize.js

如果你做了

,那就是续集
db.MyTable.findAll({}).function(response){
    console.log(response);
}

您将看到如下所示的输出(当然,取决于您的表格的样子):

[ { dataValues:
     { id: 1,
       text: 'sdf',
       complete: false,
       createdAt: Thu Jan 19 2017 11:55:38 GMT-0500 (Eastern Standard Time),
       updatedAt: Thu Jan 19 2017 11:55:38 GMT-0500 (Eastern Standard Time) },
    _previousDataValues:
     { id: 1,
       text: 'sdf',
       complete: false,
       createdAt: Thu Jan 19 2017 11:55:38 GMT-0500 (Eastern Standard Time),
       updatedAt: Thu Jan 19 2017 11:55:38 GMT-0500 (Eastern Standard Time) },
    _changed: {},
    '$modelOptions':
     { timestamps: true,
       instanceMethods: {},
       classMethods: {},
       validate: {},
       freezeTableName: false,
       underscored: false,
       underscoredAll: false,
       paranoid: false,
       rejectOnEmpty: false,
       whereCollection: null,
       schema: null,
       schemaDelimiter: '',
       defaultScope: {},
       scopes: [],
       hooks: {},
       indexes: [],
       name: [Object],
       omitNul: false,
       sequelize: [Object],
       uniqueKeys: {},
       hasPrimaryKeys: true },
    '$options':
     { isNewRecord: false,
       '$schema': null,
       '$schemaDelimiter': '',
       raw: true,
       attributes: [Object] },
    hasPrimaryKeys: true,
    __eagerlyLoadedAssociations: [],
    isNewRecord: false } ]

可以说,它是一个很复杂的对象,上面有一堆元数据。

但是,如果您尝试使用以下任一项将该大型复杂对象转换为字符串:

console.log(JSON.stringify(dbTodo));

res.json(dbTodo);

您将获得实际实体的信息(大型复杂对象的dataValues属性中的项)。对于我的测试表,它看起来像这样:

[{
    "id":1,
    "text":"sdf",
    "complete":false,
    "createdAt":"2017-01-19T16:55:38.000Z",
    "updatedAt":"2017-01-19T16:55:38.000Z"
 }]

哪个更简单(也就是我想要的)。

这种魔力是如何发生的?是sequelize创建自己的JSON.stringify()版本并表达'res.json?

它何时发生以及什么时候没有发生的规则是什么?

我搜索了sequelize docs,但没有找到一个好的解释。

1 个答案:

答案 0 :(得分:5)

这种行为有两种表现方式。

  1. 缺少的属性是不可枚举的。设置为enumerable: false的{​​{3}}定义的属性(或者只是不为enumerable设置提供值)是不可枚举的属性,JSON.stringify会忽略这些属性。您可以在Object.defineProperty的输出中查看媒体资源的enumerable设置。

  2. 该对象具有(或在其原型链中)Object.getOwnPropertyDescriptor(obj, propName)

      

    如果要进行字符串化的对象具有名为toJSON的属性,其值为函数,则toJSON()方法会自定义JSON字符串化行为:而不是要序列化的对象,{{返回的值} 1}}调用时的方法将被序列化。

    如果对象具有或继承了toJSON()方法,则该方法的返回值将成为字符串化的目标。您只需阅读toJSON的值,即可检查某个对象obj上是否存在某个对象。