详解Node.js模块间共享数据库连接的方法
来源: 阅读:1059 次 日期:2016-06-23 15:27:36
温馨提示: 小编为您整理了“详解Node.js模块间共享数据库连接的方法”,方便广大网友查阅!

我们可以写一个统一的数据库连接模块来供本地Node环境下各模块间共享使用,接下来就来详解Node.js模块间共享数据库连接的方法

这个标题本身就是一个命题,因为使用默认方式的情况下,一个 Node.js 应用里的各个模块都是共享的同一个数据库连接。但是如果姿势不对,可能会很丑陋,甚至可能会出错。

你可以忽略下面这部分,直接切入正题。

背景

最近在做专业课程设计,题目是“机票预订管理系统”。需求比较简单,就试着拿最近在学的 Node.js 来做了。本来还在调研用何种 Node.js 框架比较合适,看了几个框架之后发现这是杀鸡用牛刀,有看文档查资料的时间还不如直接动手写了。最后写完我会把代码放到 Github 上,欢迎大家批评指正。

数据库方面,以为我比较熟悉和喜欢 JSON (SQL 没学好就承认呗-_-#),所以就选择了 MongoDB。Node + Mongo 是近几年越来越热门的后端组合,网上有很多关于如何一起使用的资料。但为了节约时间(课程设计也就一个多星期),把精力多集中在系统和逻辑上,我用了 Mongoose 这个专门用于 MongoDB 数据建模的 Node.js 扩展,用它来大大减少操作数据库的代码。

正题

我建立了两个数据模型(Model),一个是用户(User),一个是航班(Flight),分别封装到了 user.js, flight.js 这两个模块(Module)里面。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,这种方式本身就是错误的。当我运行 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 上面看到的。

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!

2025国考·省考课程试听报名

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map