究竟什么是传递给回复的“数据”?

时间:2015-08-04 05:12:50

标签: sails.js

我正在编写一个以data作为输入的自定义响应,我发现添加了奇怪的属性,即:

add: [Function: add],
remove: [Function: remove]

当我注销一些示例data时,我得到:

[ { books: 
     [ { id: 1,
         title: 'A Game of Thrones',
         createdAt: '2015-08-04T04:53:38.043Z',
         updatedAt: '2015-08-04T04:53:38.080Z',
         author: 1 } ],
    id: 1,
    name: 'George R. R. Martin',
    createdAt: '2015-08-04T04:53:38.040Z',
    updatedAt: '2015-08-04T04:53:38.073Z' },
  { books: 
     [ { id: 2,
         title: 'Ender\'s Game',
         createdAt: '2015-08-04T04:53:38.043Z',
         updatedAt: '2015-08-04T04:53:38.080Z',
         author: 2 },
       { id: 3,
         title: 'Speaker for the Dead',
         createdAt: '2015-08-04T04:53:38.043Z',
         updatedAt: '2015-08-04T04:53:38.081Z',
         author: 2 } ],
    id: 2,
    name: 'Orson Scott Card',
    createdAt: '2015-08-04T04:53:38.042Z',
    updatedAt: '2015-08-04T04:53:38.074Z' } ]

这看起来很无辜,但当我在其上使用自定义序列化程序时会产生奇怪的addremove函数。如果我将这些数据直接硬编码到串行器中,那么这些数据就不存在了。显然,data里面隐藏着一些没有被打印到控制台的东西。

那么,data是什么?

编辑:所以,我仍然不太确定这里有什么其他神奇的属性,但是:

Object.keys(data[0].books))

揭示

[ '0', 'add', 'remove' ]

这些来自哪里。为什么这包含在传递给自定义响应的数据中?还有什么可能藏在那里......

更重要的是,如何剥离这个gunk并使data成为普通对象?

2 个答案:

答案 0 :(得分:1)

JSON.parse(JSON.stringify(data));

这很好地清理它,虽然它感觉像是一个黑客。 (实际上,这绝对是一个黑客攻击。)

答案 1 :(得分:1)

我假设数据库查询返回了您的data属性。 e.g:

Model.find(...).exec(function (err, data) { ... });

但这些.add().remove()方法是什么?

以下是in the docs

的内容
  

在大多数情况下,记录只是普通的旧JavaScript对象(也称为POJO)。但是,它们确实有一些用于格式化其包装数据的受保护(不可枚举)方法,以及用于持久对数据库进行编程更改的特殊方法(.save())。

我们可以go deeper

  

"收集"另一方面,关联确实有一些特殊的(不可枚举的)方法来关联和解除关联记录的关联。但是,仍必须在原始记录上调用.save(),以便将更改保留到数据库中。

orders[1].buyers.add({ name: 'Jon Snow' });
orders[1].save(function (err) { ... });

因此,如果您使用" collection"这些方法(.add().remove().save())非常有用。关联。

如何删除它们?

您需要使用.toObject()来返回剥离了所有实例方法的克隆模型实例。

您可能希望使用也返回克隆模型实例的.toJSON()。然而,这个包括所有实例方法。