TypeError:无法读取undefined的属性'findOne'

时间:2016-09-08 15:13:08

标签: node.js mongodb rest

以下是代码

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

6 个答案:

答案 0 :(得分:1)

  最新版本的mongodb@2.x

中不推荐使用

findOne

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

您可以使用此查询

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

答案 1 :(得分:0)

您在名为collectionName的变量中表示您的集合,并且您尝试在名为collection的内容上调用findOne()

而不是:

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

使用:

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

答案 2 :(得分:0)

将代码的开头更改为

var mongo = require('mongodb');
mongo.BSONPure = require('bson').BSONPure;

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

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

答案 3 :(得分:0)

使用此

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

而不是

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

在您的wine.js文件中

答案 4 :(得分:0)

在使用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);
      }}

它无效的原因是因为错误优先回调函数中的collection是操作成功时分配的参数...

Useful link about the topic ....

答案 5 :(得分:-1)

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

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

你只发2:

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

这应该是你的问题。