Node.js模块间共享数据库连接的实现方案

作者:夜航船

时间:2026-10-30

浏览:104

本文探讨Node.js应用中多个模块共享单一数据库连接的正确方法。通过对比错误的全局连接方式,介绍了利用Mongoose建立独立数据库模块并导出连接引用的方案,确保应用启动时仅建立一次连接,提高代码复用性与稳定性。

文章目录

Node.js模块间共享数据库连接的实现方案

在Node.js应用中,默认情况下各模块确实可以共享同一个数据库连接。然而,若实现方式不当,代码结构会变得混乱,甚至引发运行时错误。

这部分背景介绍可略过,直接阅读后续核心内容。

项目背景与技术选型

背景 近期进行专业课程设计,项目为“机票预订管理系统”。需求相对简单,因此尝试使用正在学习的Node.js进行开发。在调研框架时,发现现有框架过于庞大,不如直接编码高效。最终完成代码后将托管至Github,欢迎反馈。

数据库方面,鉴于对JSON的熟悉及SQL掌握程度有限,选择了MongoDB。Node结合MongoDB是近年流行的后端组合,相关资料丰富。为节省时间(课程设计周期仅一周多),将重点放在系统逻辑上,因此选用专门用于MongoDB数据建模的Node.js扩展库Mongoose,以大幅减少数据库操作代码。

错误实现与问题分析

正题 我创建了两个数据模型:用户(User)和航班(Flight),分别封装在user.js和flight.js两个模块中。Model负责与数据库交互,这两个模块均需连接数据库。初始代码如下:


// ----- user.js -----
// require mongoose.js 引用mongoose.js
var M = require('mongoose');
// connect to database 连接数据库
M.connect('mongodb://localhost/test');
// ... some other code ...

// ----- flight.js -----
// require mongoose.js 引用mongoose.js
var M = require('mongoose');
// connect to database 连接数据库
M.connect('mongodb://localhost/test');
// ... some other code ...

// ----- models.js -----
var user = require('./user'),
  flight = require('./flight');

// ----- index.js -----
var Models = require('./models');

这种写法不仅违反了DRY(Don't Repeat Yourself)原则,更是错误的实现方式。运行index.js时,会触发如下错误。


> node index.js
> Connection error: { [Error: Trying to open unclosed connection.] state: 2 }

报错信息为:尝试打开未关闭的连接。

因此,正确的做法是在应用的一个位置连接数据库,其他需要连接的模块通过该模块与数据库交互。这如同墙上的唯一插座,应统一由一个模块管理连接,其他模块复用该连接即可。

具体方案 将数据库连接逻辑封装在独立模块中,并将连接对象暴露给应用内的其他模块。其他需要数据库连接的模块只需引用此连接即可。

正确共享连接方案


// ----- database.js -----
var M = require('mongoose');
M.connect('mongodb://localhost/test');
// reference to the database connection 为这个连接创建一个引用
var db = M.connection;
// expose to modules that require database.js 把这个引用暴露给引用 database 模块的其他模块
module.exports = db;

// ----- user.js ----- flight.js 类似 -----
// ... some other code ...
// 我们会在 models.js 中,把数据库连接的引用作为参数传进来
module.exports = function( db ){
  if( db ){
    // ... do things with the connection ... 如果连接了数据库,就可以执行数据库相关的操作了
  }
}

// ----- models.js -----
// require database module, retrieve the reference to database connection 引用 databse 模块,获取数据库连接的引用
var db = require('./database');
// 把数据库连接的引用传入需要连接数据库的模块,任务完成!
var user = require('./user')( db ),
  flight = require('./flight')( db );

这是Node.js应用中多模块共享数据库连接的一种有效方法,灵感来源于StackOverflow。如有更优方案,欢迎在评论区分享。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章