javascript - 在Javascript中,mongoose/mongodb结果字段出现未定义

  显示原文与译文双语对照的内容
82 3

有没有什么是我缺少的,可以让项目记录为具有参数的对象,但是当我尝试访问该参数时。

我目前尝试的内容:

  • 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,以检查实际通过 node repl调试器的项目。 这就是我发现 http://hastebin.com/qatireweni.sm

我试过 console.log(item._doc.title),它工作得很好。 所以,这似乎是一个mongoose问题,比任何其他问题。

有类似的问题,但它们似乎与对象的'这个'访问相关,或者试图获取函数范围内的对象。 在这种情况下,我认为我不会做任何事,但是如果我是错误的,请告诉我。 谢谢

时间: 原作者:

96 1

解决方案

你可以调用 toObject 方法来访问字段。 例如:


var itemObject = item.toObject();


console.log(itemObject.title);//"foo"



为何

就像你指出的,实际字段的存储在文档_doc 字段中。

但为什么 console.log(item) => { title:"foo", content:"bar" }

的源代码中,我们可以发现 Document 调用 toObject 方法的toString 方法。 因此 console.log 将显示字段'正确'。 源代码显示为 below:


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());


};



94 2

确保已经在架构中定义了标题:


var MyCollectionSchema = new mongoose.Schema({


 _id: String,


 title: String


});



原作者:
71 4

尝试在 item 上执行 for in 循环,看看是否可以访问值。


for (var k in item) {


 console.log(item[k]);


}



如果它有效,就意味着你的键有一些 non-printable 字符或者类似的。

从你在评论中所说,itemString 原始包装器的一个实例。

: )


var s = new String('test');


typeof s;//object


s instanceof String;//true



要验证这里理论,请尝试:


eval('(' + item + ')').title;



也可以能是 item 是一个对象,它有一个 toString 方法来显示你所看到的内容。

编辑:为了快速识别这些问题,可以使用而不是 console.log,因为它显示对象属性的交互式列表。 你还可以使用断点,并添加表。

原作者:
...