当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《SequelizePOJOJSON.stringify魔术如何工作?》经验,为你挑选了1个好方法。

如果你做一个

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 } ]

可以说,它是一个很大的复杂对象,上面带有一堆metaData。

但是,如果尝试使用以下任一方法将那个大的复杂对象转换为字符串:

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?

何时发生和何时不发生有关什么规则?

我搜索了续集 文档,但找不到很好的解释。



1> apsillers..:

这种行为可以通过两种方式体现出来。

    缺少的属性是不可枚举的。由Object.definePropertyset 定义为enumerable: false(或根本不提供设置值enumerable)的属性是不可枚举的属性,并被忽略JSON.stringify。您可以enumerable在的输出中检查属性的设置Object.getOwnPropertyDescriptor(obj, propName)

    该对象具有(或在其原型链中)一种toJSON方法:

    如果要被字符串化的对象具有一个名为toJSON的属性,其值是一个函数,则该toJSON()方法将自定义JSON字符串化行为:代替被序列化的对象,该toJSON()方法返回的值将在被序列化时而不是被序列化。

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

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有