Node.js中的JSON.stringify

时间:2019-04-04 10:32:30

标签: node.js sequelize.js

为什么当我在node.js中对来自数据库请求的数据使用JSON.stringify时,会得到数据本身的对象,如果我使用console.log,则会得到很多其他参数,例如dataValues,_previousDataValues,_modelOptions ... 。 我使用sequelize.js

console.log(JSON.stringify(data,'',2))

{
  id:1
}

console.log(数据)

Kindergarten_data {
  dataValues:
    { id: 1}
 _changed: {},
  _modelOptions:
   { timestamps: true,
     validate: {},
     freezeTableName: true,
     underscored: false,
     underscoredAll: false,
     paranoid: false,
     rejectOnEmpty: false,
     whereCollection: null,
     schema: null,
     schemaDelimiter: '',
     defaultScope: {},
     scopes: [],
     indexes: [],...

2 个答案:

答案 0 :(得分:1)

JSON.stringify()后面有一个protocol

  

JSON.stringify()将值转换为表示它的JSON表示法:

     
      
  • 如果该值具有toJSON()方法,则负责定义要序列化的数据。
  •   根据传统的转换语义,
  • BooleanNumberString对象在字符串化过程中被转换为相应的原始值。
  •   
  • [...]
  •   

很明显,您的字符串化内容根本不遵循您在console.log()上看到的内容,因为您必须看到{ dataValues: {id: 1} ...,而看到的是{id: 1}。因此,这并不是其他答案可能建议的一些神秘的“ JSON可表示性”,而是sequelize.js仅提供了toJSON()方法,因此它仅以JSON格式导出您的数据,而不是整个基础结构。

方法在这里:https://github.com/sequelize/sequelize/blob/master/lib/model.js#L4226

toJSON() {
  return _.cloneDeep(
    this.get({
      plain: true
    })
  );
}

它引用的get()在这里:https://github.com/sequelize/sequelize/blob/master/lib/model.js#L3313

get(key, options) {
  if (options === undefined && typeof key === 'object') {
    options = key;
    key = undefined;
  }

  [...]

  if (key) {
    [...]
  }

  return this.dataValues;
}

cloneDeep()只是复制事物,在这里没关系。
重要的是上面的return this.dataValues;。那条线剥去了您在控制台中看到的对象,并导致仅序列化其dataValues字段。

小型演示:

var data1={
  dataValues:{id:1},
  somethingElse:[1,2,3],
  _stuff:{a:'b'}
};

var data2={
  dataValues:{id:1},
  somethingElse:[1,2,3],
  _stuff:{a:'b'},
  toJSON:function(){return this.dataValues;}
};

console.log("data1:",JSON.stringify(data1));
console.log("data2:",JSON.stringify(data2));

答案 1 :(得分:-1)

JSON.stringify()返回其输入的JSON安全字符串表示形式(例如JS对象)。它将删除所有没有等效JSON表示形式的属性/字段。 而console.log()将JS对象直接输出到控制台。