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
更改为 updateOne
和 updateMany
并弃用 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”的主要内容,如果未能解决你的问题,请参考以下文章
(Discord.js)TypeError:无法读取未定义的属性“添加”
如何使用自定义错误消息捕获“TypeError:无法读取未定义的属性(读取'0')”?