Node.js和JSON.stringify缺少对象的某些值/参数

时间:2011-09-09 20:27:13

标签: json node.js asynchronous mongoose

也许我不理解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属性(稍后当函数存在时我似乎有其他有趣的问题,我认为这与'那'有关并且这嵌套在多个fxn中呼叫)。

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

当我这样做时

console.log(that.thing.toJSON) 

我明白了:

  

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

感谢。

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

由于你提到mongoose,that.thing可能是一个具有某些特定属性的特殊对象。

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

thing实际上是具有某种可怕逻辑的getter / setter

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

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

因此,一个简单的console.log(that.thing.toJSON);应该确定您的问题

无论如何,当您想要记录数据并确保以阻塞方式记录当前数据时,您真正需要做的事情。

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

答案 2 :(得分:1)

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

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

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