You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:50:29