Mongoose报错'disconnect is not a function'的原因及修复方案
解决Mongoose中
TypeError: db.disconnect is not a function错误 你的问题根源其实不是作用域问题,而是对mongoose.connect()的返回值理解有误。让我一步步拆解:
问题原因
你代码里的这行:
const db = mongoose.connect('mongodb://localhost:27017/contact-manager');
mongoose.connect()返回的是一个Promise对象,并不是数据库连接实例。这个Promise只会在连接成功/失败时resolve/reject,本身并没有disconnect()方法,所以你调用db.disconnect()才会抛出类型错误。
好在数据能成功保存,说明连接本身是正常的,只是断开连接的方式错了。
修复方案
方案1:直接使用Mongoose全局断开方法(最简单)
Mongoose提供了全局的disconnect()方法,不需要依赖connect的返回值,直接替换代码里的db.disconnect()为mongoose.disconnect()即可:
修改addContact和getContact函数:
const addContact = (contact) => { Contact.create(contact, (err) => { assert.equal(null, err); console.info('New contact added'); mongoose.disconnect(); // 替换这里 }); }; const getContact = (name) => { const search = new RegExp(name, 'i'); Contact.find({$or: [{firstname: search }, {lastname: search }]}).exec((err, contact) => { assert.equal(null, err); console.info(contact); console.info(`${contact.length} matches`); mongoose.disconnect(); // 替换这里 }); };
方案2:获取真实的数据库连接实例(如果你需要操作连接对象)
如果你确实需要持有连接实例,可以通过mongoose.connection获取,它是Mongoose管理的连接对象,拥有close()或disconnect()方法(两者效果一致):
调整初始化代码:
const mongoose = require('mongoose'); const assert = require('assert'); mongoose.Promise = global.Promise; // 先获取连接实例 const db = mongoose.connection; // 然后执行连接 mongoose.connect('mongodb://localhost:27017/contact-manager') .then(() => console.log('Successfully connected to database')) .catch(err => console.error('Database connection error:', err)); // 后续断开时用db.close()或者db.disconnect() const addContact = (contact) => { Contact.create(contact, (err) => { assert.equal(null, err); console.info('New contact added'); db.close(); // 或者 db.disconnect() }); };
额外提示
因为你做的是命令行工具,每次执行完命令断开连接是合理的。但如果是Web服务类应用,不要每次操作后都断开连接——Mongoose默认会维护连接池,保持连接复用能提升性能。
内容的提问来源于stack exchange,提问作者user465001
相关产品推荐
相关产品推荐

