Mongoose/MongoDB 结果字段在 Javascript 中未定义

新手上路,请多包涵

有没有什么东西是我遗漏的,它允许项目作为带有参数的对象进行记录,但是当我尝试访问该参数时,它是未定义的?

到目前为止我已经尝试过:

  • 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 许可协议

阅读 251
2 个回答

解决方案

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

 var itemObject = item.toObject();
console.log(itemObject.title); // "foo"

为什么

正如您指出的那样, 真实字段存储在文档的 _doc 字段中

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

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

原文由 Vincent Bel 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 var MyCollectionSchema = new mongoose.Schema({
    _id: String,
    title: String
});

原文由 Joan-Diego Rodriguez 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题