如果你做一个
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?
何时发生和何时不发生有关什么规则?
我搜索了续集 文档,但找不到很好的解释。
这种行为可以通过两种方式体现出来。
缺少的属性是不可枚举的。由Object.defineProperty
set 定义为enumerable: false
(或根本不提供设置值enumerable
)的属性是不可枚举的属性,并被忽略JSON.stringify
。您可以enumerable
在的输出中检查属性的设置Object.getOwnPropertyDescriptor(obj, propName)
。
该对象具有(或在其原型链中)一种toJSON
方法:
如果要被字符串化的对象具有一个名为
toJSON
的属性,其值是一个函数,则该toJSON()
方法将自定义JSON字符串化行为:代替被序列化的对象,该toJSON()
方法返回的值将在被序列化时而不是被序列化。
如果对象具有或继承toJSON
方法,则该方法的返回值将成为字符串化的目标。您obj
只需读取的值即可检查某个对象上是否存在一个对象obj.toJSON
。