【问题标题】:TypeError: Cannot read property 'findOne' of undefinedTypeError:无法读取未定义的属性“findOne”
【发布时间】:2017-01-16 14:26:16
【问题描述】:

这里是代码

var mongo = require('mongodb');

var databaseName = 'Starter',
    collectionName = 'wines';

var Server = mongo.Server,
    Db = mongo.Db,
    BSON = mongo.BSONPure;

db = new Db(databaseName, server);

db.open(function(err, db) {
  if(!err) {
    console.log("Connected to 'winedb' database");
    db.collection(collectionName, {strict:true}, function(err, collection) {
        if (err) {
            console.log("The 'wines' collection doesn't exist. Creating it with sample data...");
            populateDB();
        }
    });
  }
});

exports.findById = function(req, res) {
  var id = req.params.id;
  console.log('Retrieving wine: ' + id);

  db.collection(collectionName, function(err, collection) {
      collection.findOne({'_id':new BSON.ObjectID(id)}, function(err, item) {
          res.send(item);
      });
  });

};

这些代码基于带有 mongoDB 的 nodejs 的 restful api 示例。 但是,它似乎无法识别函数findOne。有人可以指出问题吗?

错误信息:

TypeError: Cannot read property 'findOne' of undefined

【问题讨论】:

  • 您真的在 DB 中看到了 wines 集合吗?
  • 确保始终检查错误。
  • 关于错误的另一件事。找不到集合仍然会(至少我上次尝试过这样的事情)返回一个空数组,但没有错误。
  • 你用的是哪个版本的mongodb?
  • wines 在那里。我就是不能使用 findOne 函数来获取数据

标签: node.js mongodb rest


【解决方案1】:

在第一个 db.collection 中,您发送 3 个参数,例如:

db.collection(collectionName, {strict:true}, function(err, collection)

在你只发送 2 之后:

db.collection(collectionName, function(err, collection)

这应该是你的问题。

【讨论】:

  • “options”参数是可选的,因此您可以使用 2 个或 3 个参数来调用它。
【解决方案2】:

findOne 在最新版本的 mongodb@2.x 中已弃用

https://github.com/mongodb/node-mongodb-native/blob/2.0/lib/collection.js

您可以改用此查询

find(query).limit(1).next(function(err, doc){
   // handle data
})

【讨论】:

  • 奇怪的是,当他们刚刚从 update 更改为 updateOneupdateMany 并弃用 update 时,他们正在弃用 findOne!也就是说,findOne 现在仍然存在,所以我看不出这实际上是如何解决任何问题的。
【解决方案3】:

您在一个名为 collectionName 的变量中表示您的集合,并且您正试图在一个名为集合的东西上调用 findOne(),但它不起作用。

而不是:

collection.findOne({'_id':new BSON.ObjectID(id)}, function(err, item)

使用:

collectionName.findOne({'_id':new BSON.ObjectID(id)}, function(err, item)

【讨论】:

    【解决方案4】:

    将代码的开头更改为

    var mongo = require('mongodb');
    mongo.BSONPure = require('bson').BSONPure;
    
    var databaseName = 'Starter',
        collectionName = 'wines';
    
    var Server = mongo.Server,
        Db = mongo.Db,
        BSON = mongo.BSONPure;
    

    【讨论】:

      【解决方案5】:

      使用这个

      collection.findOne({'_id':new mongo.ObjectID(id)}, function(err, item) {
      

      而不是

      collection.findOne({'_id':new BSON.ObjectID(id)}, function(err, item) {
      

      在您的wine.js 文件中

      【讨论】:

        【解决方案6】:

        在使用 findOne 之前尝试将收集记录到控制台或将整个内容包装在一个:


        if(err){log} else{findone}


              if(err){
              console.log(err)
              }
              else{
              collection.findOne({'_id':new BSON.ObjectID(id)}, function(err, item){
              res.send(item);
              }}
        

        它不起作用的原因是因为您的 error-first 回调 函数中的collection 是操作成功时分配的参数...

        Useful link about the topic ....

        【讨论】:

          猜你喜欢
          • 2021-05-29
          • 2021-09-06
          • 1970-01-01
          • 1970-01-01
          • 2020-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多