TypeError:无法读取未定义的属性“findOne”

Posted

技术标签:

【中文标题】TypeError:无法读取未定义的属性“findOne”【英文标题】:TypeError: Cannot read property 'findOne' of undefined 【发布时间】: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 函数来获取数据 【参考方案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 elsefindone


      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 ....

【讨论】:

以上是关于TypeError:无法读取未定义的属性“findOne”的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法读取未定义的属性(读取“公会”)

(Discord.js)TypeError:无法读取未定义的属性“添加”

如何使用自定义错误消息捕获“TypeError:无法读取未定义的属性(读取'0')”?

TypeError:无法读取未定义的属性(读取“名称”)

TypeError:无法读取未定义的属性“findAll”(expressjs)

TypeError:无法读取未定义的属性(读取“问题”)