无法从Mongoose连接获取MongoClient实例,为何client为undefined?
问题:Mongoose Connection.client 为 undefined 的原因?
根据Mongoose官方API文档,Connection的client属性应为MongoClient实例,但运行以下代码时触发错误:something bad happened in dbconnect: TypeError: Cannot read properties of undefined (reading 'db'),原因是client为undefined。
const connection = await mongoose.connect("mongodb://0.0.0.0:27017"); console.log('connected to Mongo'); const client = connection.client; // 预期获取MongoClient实例 try { const db = client.db("admin"); console.log(`connected to database ${db.databaseName}`); const collections = await db.collections(); collections.forEach(c => {console.log(`got collection ${c.collectionName}`)}) } catch(exception) { console.log(`something bad happened in dbconnect: ${exception}`); // 触发错误 } finally { console.log("closing database connection"); connection.disconnect(); }
解决方案
问题出在对mongoose.connect()返回值的理解上:mongoose.connect()返回的并不是直接的Connection实例,而是一个包含connection属性的包装对象。你把整个返回对象当成了Connection,自然找不到client属性。
修正方式有两种:
方式一:使用mongoose.connection获取连接实例
await mongoose.connect("mongodb://0.0.0.0:27017"); console.log('connected to Mongo'); const connection = mongoose.connection; const client = connection.client; // 现在能正确获取MongoClient实例 try { const db = client.db("admin"); console.log(`connected to database ${db.databaseName}`); const collections = await db.collections(); collections.forEach(c => {console.log(`got collection ${c.collectionName}`)}) } catch(exception) { console.log(`something bad happened in dbconnect: ${exception}`); } finally { console.log("closing database connection"); connection.disconnect(); }
方式二:从connect返回值中解构connection
const { connection } = await mongoose.connect("mongodb://0.0.0.0:27017"); console.log('connected to Mongo'); const client = connection.client; // 正确获取MongoClient实例 try { const db = client.db("admin"); console.log(`connected to database ${db.databaseName}`); const collections = await db.collections(); collections.forEach(c => {console.log(`got collection ${c.collectionName}`)}) } catch(exception) { console.log(`something bad happened in dbconnect: ${exception}`); } finally { console.log("closing database connection"); connection.disconnect(); }
修改后就能正确获取到MongoClient实例,调用client.db()方法也不会再触发错误。
内容的提问来源于stack exchange,提问作者Manu Chadha
相关产品推荐
相关产品推荐

