Node.js项目Mongoose路由模块无需重复连接数据库的原理问询
问题解答
核心原因是两点机制的共同作用:
- Node.js CommonJS 模块的单例缓存特性
Node.js 中使用require加载第三方模块时,同一个模块只会在第一次被加载时执行一次,执行后的模块实例会被全局缓存,后续所有文件中require('mongoose')拿到的都是同一个 Mongoose 实例对象,不会重新初始化新的实例。 - Mongoose 内部默认的连接管理逻辑
你在 index.js 中调用mongoose.connect()时,Mongoose 会自动将建立成功的数据库连接挂载到当前 Mongoose 实例的内部默认连接对象上,不需要开发者手动传递连接实例。你在任意模块中通过mongoose.model()定义的模型、调用模型的增删改查方法时,默认都会复用这个已经建立好的全局默认连接。
对应到你给出的代码执行流程:
- index.js 首先加载 Mongoose 模块,调用
mongoose.connect()完成默认连接的初始化 - 之后才通过
require('./routes/genres')加载路由模块 - genres.js 中
require('mongoose')拿到的是和 index.js 完全相同的 Mongoose 实例,直接就可以用已经初始化好的默认连接操作数据库,不需要重复调用连接方法。
补充说明:如果你需要同时连接多个不同的 MongoDB 数据库,才需要调用
mongoose.createConnection()方法创建独立的连接实例,这种场景下你才需要手动传递连接实例到各个业务模块,不能直接用默认的全局连接。
内容的提问来源于stack exchange,提问作者Laxus
相关产品推荐
相关产品推荐

