详解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 应用的多个模块共享数据库连接的一种方法。是我在 * 上面看到的。如果你有更好的方法,欢迎在评论中分享给大家!
推荐阅读
-
PHP连接及操作PostgreSQL数据库的方法详解
-
详解Node.js模块间共享数据库连接的方法
-
node.js连接MongoDB数据库的2种方法教程
-
详解Node.js中path模块的resolve()和join()方法的区别
-
详解数据库多表连接查询的实现方法
-
PHP连接及操作PostgreSQL数据库的方法详解
-
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
-
node.JS事件机制与events事件模块的使用方法详解
-
详解Node.js模块间共享数据库连接的方法
-
在IntelliJ IDEA中使用Java连接MySQL数据库的方法详解