2017-01-19 5 views
0

あなたはPOJO JSON.stringifyの魔法はどのように動作しますか? sequelizeで

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

これは、かなり簡単です(私が望むだけです)。

この魔法はどのように起こりますか? JSON.stringify()の独自のバージョンを作成し、 'res.json'を表現し続けるのですか?

起こったときと起こらないときのルールは何ですか?

sequelizedocsを検索したところ、説明が見つかりませんでした。

答えて

3

この現象が現れる可能性がある2つの方法があります。

  1. 不足しているプロパティは列挙できません。 Object.definePropertyによって定義されたプロパティはenumerable: falseに設定されています(または単にenumerable設定の値を指定しません)は、列挙できないプロパティで、JSON.stringifyによって無視されます。プロパティのenumerableの設定を出力Object.getOwnPropertyDescriptor(obj, propName)で確認することができます。

  2. オブジェクトが持っている(またはそのプロトタイプチェーン内に有する)toJSON method

    文字列化されたオブジェクトは、その値が関数であるtoJSONという名前のプロパティを持っている場合、toJSON()方法は、JSONの文字列化の挙動をカスタマイズ:オブジェクトがシリアル化される代わりに、呼び出されたときにtoJSON()メソッドによって返された値がシリアル化されます。

    オブジェクトがtoJSONメソッドを持っているか継承している場合、そのメソッドの戻り値はストリング化の対象になります。オブジェクトobjにオブジェクトが存在するかどうかは、単にobj.toJSONの値を読み取ることで確認できます。

+0

偉大な答え!ありがとう。 –

関連する問題