也许我不理解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(); }
感谢。
答案 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()),看看你是否得到了你想要的东西。