Node.js与MongoDB开发报错:TypeError: db.collection is not a function 求助
解决TypeError: db.collection is not a function的问题
嘿,我刚帮你排查了这个错误,问题出在MongoDB Node.js驱动的版本差异上!
错误原因
你现在用的应该是MongoDB驱动3.x及以上的版本,这个版本对MongoClient.connect的回调参数做了关键改动:
- 在旧版本(2.x)中,回调的第二个参数
db就是直接的数据库实例,可以直接调用db.collection(); - 但在新版本里,回调的第二个参数变成了MongoClient客户端实例(我们习惯叫它
client),这个实例本身没有collection方法,所以你调用db.collection就会抛出TypeError。
解决方案一:适配新版本回调写法
只需要修改几处代码,先从客户端实例中获取数据库对象,再进行操作:
const MongoClient = require('mongodb').MongoClient; const url = 'mongodb://localhost:27017/myproject'; MongoClient.connect(url, function(err, client){ if (err){ return console.dir(err); } // 从客户端实例中获取数据库对象 const db = client.db('myproject'); console.log('connected to mdb'); InsertDoc(db, function(){ // 关闭客户端而不是数据库对象 client.close(); }) }); const InsertDoc = function(db, callback){ const collection = db.collection('users'); // 新版本驱动推荐用insertOne替代旧的insert方法 collection.insertOne({ name : 'vishnu', email:'vishnu@123' }, function(err, result){ if(err){ return console.dir(err); } console.log('inserted doc'); console.log(result); callback(result); }); }
解决方案二:用更清晰的async/await写法(推荐)
回调嵌套容易让人头疼,用async/await会让代码逻辑更直观,也适合新手学习现代JS写法:
const MongoClient = require('mongodb').MongoClient; const url = 'mongodb://localhost:27017/myproject'; async function main() { let client; try { // 连接数据库 client = await MongoClient.connect(url); const db = client.db('myproject'); console.log('connected to mdb'); // 插入文档 const collection = db.collection('users'); const result = await collection.insertOne({ name : 'vishnu', email:'vishnu@123' }); console.log('inserted doc'); console.log(result); } catch (err) { console.dir(err); } finally { // 确保客户端无论成功失败都会关闭 if (client) { await client.close(); } } } // 执行主函数 main();
额外提醒
如果你非要沿用旧版写法,可以把驱动降级到2.x版本(比如执行npm install mongodb@2.2.36),但不推荐这么做——新版本驱动有更多性能优化和bug修复,适配新写法对你后续开发更有帮助。
内容的提问来源于stack exchange,提问作者king of nerds
相关产品推荐
相关产品推荐

