【问题标题】:Node.js and JSON.stringify missing some values/parameters from objectNode.js 和 JSON.stringify 缺少对象中的一些值/参数
【发布时间】:2011-11-14 02:08:05
【问题描述】:

也许我不像我想的那样理解 javascript/coffee 脚本,但是当我这样做时:

that.thing = thing
that.thing.title = "some title"
console.log(that.thing.title)
console.log(JSON.stringify(that.thing)

我得到输出:

一些标题

{"creation_date":"2011-09-09T00:40:03.742Z","_id":"4e6960638ec80519a0000013"}

问题是我在执行 stringify 时似乎丢失了 title 属性(后来当函数存在时,我似乎遇到了其他有趣的问题,我认为这些问题与 'that' 和 this 嵌套在多个 fxn 中有关电话)。

(我现在不得不做一个丑陋的解决方案,我这样做了。thing = {} 来解决我的问题。我之前必须解决的其他问题包括 node.js + async + mongoose.find,这都是在 async .findEach)

当我这样做时

console.log(that.thing.toJSON) 

我明白了:

function () { return this.toObject(); }

谢谢。

【问题讨论】:

  • 你确定that.thing 不是一个可怕的getter/setter 吗?

标签: json node.js asynchronous mongoose


【解决方案1】:

这是因为 Model.find() 返回一个 MongooseDocument。如果你想要一个可以添加属性的纯 JavaScript 对象,你需要指定“精益”选项:

Model.find().lean().exec(function (err, thing) {
    thing.title = "some title";
    console.log(JSON.stringify(thing));
});

如果您不需要再次保存事物对象,这将正常工作(因为这不是 MongooseDocument,没有应用 getter 和 setter)。

【讨论】:

  • 只是一个提示。当您尝试使用.save() 执行此操作时,它将无法正常工作。然后,您宁愿从mongoose API 执行thing.toObject()。你的博客条目引导我,让我找出来。谢谢。
【解决方案2】:

既然你提到了猫鼬,那that.thing 可能是一个具有一些特定属性的特殊对象。

有两件事可能会影响这一点。

thing 实际上是一个带有一些可怕逻辑的 getter/setter

或者更可能thing 具有将对象写入json 的.toJSON 方法,而您没有增加或删除该方法以使JSON.stringify 工作。

我的默认JSON.stringify 调用.toJSON 方法(如果存在)。

所以一个简单的console.log(that.thing.toJSON); 应该可以识别您的问题

无论如何,当您想要记录数据并确保它以阻塞方式记录当前数据时,您真正应该做什么。

console.warn(util.inspect(that.thing));

【讨论】:

  • 谢谢。我得到的是:“ function () { return this.toObject(); }” 我不是 100% 确定如何通过节点“调试”javascript(到目前为止还没有找到比 Chrome 更好的调试器)。怎么做我知道这是否是一些 getter/setter?
  • @user885355 因为它有 toJSON 方法 JSON.stringify 正在序列化的东西是 that.thing.toObject() 所以这就是它坏的原因。
  • 我明白了,所以理想情况下,我必须像您一样修改 JSON.stringify 以检查 .toJSON。我不是 100% 确定我会如何做到这一点,但我会调查一下。如果我想在节点中阅读此类调用的源代码,你会建议只去 github repo / docs 吗? @Raynos
  • @user885355 不可以。您需要谋杀.toJSON 或不要使用JSON.stringify 记录数据。只需使用console.warn(util.inspect(obj))
【解决方案3】:

您会看到“function () { return this.toObject(); }”,因为 toJSON 是一个原型函数。

也就是说,console.log(that.thing.toJSON) 将打印函数本身,但 console.log(that.thing.toJSON()) 将打印从函数返回的值。添加额外的括号将执行该功能。

试试 console.log(that.thing.toJSON()) 看看你是否得到了你想要的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2011-04-24
    • 2016-11-06
    相关资源
    最近更新 更多