MongoDB 3.0.5版本报TypeError: database.db.collection is not a function求助
问题原因及解决方法
问题根源:MongoDB驱动3.x与2.x的API核心变更
在MongoDB Node.js驱动2.x版本中,MongoClient.connect的回调函数第二个参数直接返回的是数据库实例,所以你可以直接调用.collection()方法操作集合。但升级到3.x版本后,这个回调参数变成了MongoClient客户端实例,不再是直接的数据库对象——这就是你遇到TypeError: database.db.collection is not a function的核心原因。
另外还有一个隐藏的坑:你原代码里在collection.find({}).toArray()的异步回调执行前就调用了database.close(),这会导致查询还没完成就提前关闭连接,大概率会引发其他隐性错误,这个问题在2.x里可能没暴露,但3.x里必须同步修正。
解决方法
根据你的连接URL是否指定了目标数据库,分两种修正方式:
方式1:连接URL已包含数据库名(例如mongodb://localhost:27017/yourDBName)
如果你的cn.url已经指定了要连接的数据库,只需从客户端实例中获取对应数据库对象,再操作集合,同时把关闭连接的逻辑放到查询回调里:
const cn = require('./connect'); function showItems(req, callback) { cn.MongoClient.connect(cn.url, (err, client)=> { if (err) throw err; // 不要忽略错误处理 // 获取URL中指定的数据库实例 const db = client.db(); const collection = db.collection('items'); collection.find({}).toArray((err, result)=> { if (err) throw err; // 处理查询阶段的错误 callback(result); client.close(); // 确保查询完成后再关闭连接 }); }) } module.exports = showItems;
方式2:连接URL未指定数据库名(例如mongodb://localhost:27017/)
如果连接URL没有明确数据库,需要在client.db()中传入数据库名称来获取实例:
const cn = require('./connect'); function showItems(req, callback) { cn.MongoClient.connect(cn.url, (err, client)=> { if (err) throw err; // 传入数据库名称获取对应实例 const db = client.db('yourTargetDatabaseName'); const collection = db.collection('items'); collection.find({}).toArray((err, result)=> { if (err) throw err; callback(result); client.close(); }); }) } module.exports = showItems;
额外优化建议
- 实际项目中推荐使用async/await语法代替嵌套回调,代码可读性更高,错误处理也更直观;
- 尽量避免每次请求都创建新连接,MongoDB驱动默认启用连接池,你可以在连接选项中配置
poolSize参数来优化连接复用效率。
内容的提问来源于stack exchange,提问作者feishuoren
相关产品推荐
相关产品推荐

