2017-01-19 2 views
0

В sequelize если вы делаетеКак работает Sequelize POJO JSON.stringify?

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?

Каковы правила, когда это происходит и когда этого не происходит?

Я искал через sequelizedocs и не нашел хорошего объяснения.

ответ

3

Существует два способа проявления этого поведения.

  1. Недостающие свойства не подлежат перечислению. Свойства, заданные Object.defineProperty, установлены на enumerable: false (или просто не задают значение для настройки enumerable) являются неперечислимыми свойствами и игнорируются JSON.stringify. Вы можете проверить настройки свойства enumerable на выходе Object.getOwnPropertyDescriptor(obj, propName).

  2. Объект имеет (или имеет в своей цепи прототипов) а toJSON method:

    Если объект быть строковым имеет свойство с именем toJSON, значение которого является функцией, то метод toJSON() адаптирует JSON поведение stringification: вместо сериализуемого объекта значение, возвращаемое методом toJSON() при вызове, будет сериализовано.

    Если объект имеет или наследует метод toJSON, тогда возвращаемое значение этого метода будет целью для строкования. Вы можете проверить, существует ли какой-либо объект на каком-либо объекте obj, просто прочитав значение obj.toJSON.

+0

Отличный ответ! Благодарю. –

Смежные вопросы