有没有什么东西是我遗漏的,它允许项目作为带有参数的对象进行记录,但是当我尝试访问该参数时,它是未定义的?
到目前为止我已经尝试过:
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”访问有关,或者它们试图使对象超出函数范围。在这种情况下,我不认为我正在做其中任何一个,但如果我错了请通知我。谢谢
原文由 tippenein 发布,翻译遵循 CC BY-SA 4.0 许可协议
解决方案
您可以调用
toObject
方法来访问字段。例如:为什么
正如您指出的那样, 真实字段存储在文档的
_doc
字段中。但为什么
console.log(item)
=>{ title: "foo", content: "bar" }
?从 mongoose(document.js)源码 中可以发现
toString
Document
调用了toObject
方法。所以console.log
将“正确”显示字段。源代码如下所示: