MongoDB升级到3.0.1后NodeJS V8应用db.collection报错咨询
问题原因
这个坑我升级MongoDB驱动的时候也踩过!核心原因是3.x版本的MongoDB Node.js驱动彻底改变了MongoClient.connect()的返回值:
- 在你之前用的2.x版本里,
connect()成功后直接返回的是数据库(Db)实例,所以你能直接调用db.collection()方法。 - 但升级到3.x之后,
connect()返回的变成了MongoClient客户端实例,这个客户端对象本身并没有collection()方法,必须先通过它获取对应的数据库实例,才能操作集合——这就是你看到TypeError: db.collection is not a function的根本原因。
修复代码
只需要修改connection的处理逻辑,从返回的客户端实例中拿到数据库对象就行,两种写法都可以:
写法一(利用连接字符串里指定的数据库)
let mongodb = require('mongodb'); let mongoClient = mongodb.MongoClient; // connect返回的Promise现在resolve的是MongoClient实例 let connection = mongoClient.connect('mongodb://localhost:27017/Test'); let getCollection = function (c) { return connection.then(function (client) { // 因为连接字符串里已经指定了Test数据库,直接调用client.db()就能拿到对应实例 let db = client.db(); return db.collection(c); }); };
写法二(明确指定数据库)
如果不想把数据库名写在连接字符串里,也可以这样:
let mongodb = require('mongodb'); let mongoClient = mongodb.MongoClient; let connection = mongoClient.connect('mongodb://localhost:27017'); let getCollection = function (c) { return connection.then(function (client) { // 手动指定要使用的Test数据库 let db = client.db('Test'); return db.collection(c); }); };
额外建议:处理Promise错误
另外,你代码里出现的UnhandledPromiseRejectionWarning是因为没有捕获Promise的错误,建议在调用getCollection的时候加上.catch():
getCollection('your_target_collection') .then(collection => { // 在这里执行集合操作,比如find、insert等 }) .catch(err => { console.error('获取集合失败:', err); });
内容的提问来源于stack exchange,提问作者Aksenov Vladimir
相关产品推荐
相关产品推荐

