我是否缺少一些东西可以允许项目记录为带有参数的对象,但是当我尝试访问该参数时,它是未定义的?
到目前为止我尝试过的:
-
console.log(item)
=> { title: "foo", content: "bar" }
, 没关系
-
console.log(typeof item)
=> 对象
-
console.log(item.title)
=>“未定义”
我将包含一些上下文,以防它与问题相关。
var TextController = function(myCollection) {
this.myCollection = myCollection
}
TextController.prototype.list = function(req, res, next) {
this.myCollection.find({}).exec(function(err, doc) {
var set = new Set([])
doc.forEach(function(item) {
console.log(item) // Here item shows the parameter
console.log(item.title) // "undefined"
set.add(item.title)
})
res.json(set.get());
})
}
根据我放弃的建议debugger
在此行之前通过节点 repl 调试器检查实际是什么项目。这是我发现的:http://hastebin.com/qatireweni.sm
从这里我尝试过console.log(item._doc.title)
它工作得很好......所以,这现在看起来更像是一个猫鼬问题。
有与此类似的问题,但它们似乎与对象的“this”访问有关,或者它们试图将对象获取到函数范围之外。在这种情况下,我认为我没有做其中任何一个,但如果我错了请告诉我。谢谢
Solution
您可以致电toObject
方法来访问字段。例如:
var itemObject = item.toObject();
console.log(itemObject.title); // "foo"
Why
正如你指出的那样真实字段存储在_doc
文档的字段.
But why console.log(item)
=> { title: "foo", content: "bar" }
?
From mongoose源代码(document.js),我们可以发现toString
的方法Document
打电话给toObject
方法。所以console.log
将“正确”显示字段。源码如下所示:
var inspect = require('util').inspect;
...
/**
* Helper for console.log
*
* @api public
*/
Document.prototype.inspect = function(options) {
var isPOJO = options &&
utils.getFunctionName(options.constructor) === 'Object';
var opts;
if (isPOJO) {
opts = options;
} else if (this.schema.options.toObject) {
opts = clone(this.schema.options.toObject);
} else {
opts = {};
}
opts.minimize = false;
opts.retainKeyOrder = true;
return this.toObject(opts);
};
/**
* Helper for console.log
*
* @api public
* @method toString
*/
Document.prototype.toString = function() {
return inspect(this.inspect());
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)