Node.js 多模块共享数据库链接

本文介绍了在 Node.js 项目中不一样模块之间共享数据库链接的方法。javascript

这个标题自己就是一个命题,由于使用默认方式的状况下,一个 Node.js 应用里的各个模块都是共享的同一个数据库链接。可是若是姿式不对,可能会很丑陋,甚至可能会出错。html

你能够忽略下面这部分,直接切入正题java

背景

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

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

正题

我创建了两个数据模型(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 }

错误是:尝试打开未关闭的链接。bash

因此咱们应该在一个地方链接一次数据库,而后其余须要链接数据库的模块经过这个模块来和数据库交互。就好像插线板,义无反顾地吼叫道:“墙上就一个插座,大家不要抢了!放着我来!大家。。。就能够了!”框架

具体方案

咱们把链接数据库的动做放到一个模块里,而且把链接暴露给整个应用中的其余模块,而后其余须要链接数据库的模块引用这个链接便可。mongoose

// ----- 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 上面看到的。若是你有更好的方法,欢迎在评论中分享给你们!

相关文章
相关标签/搜索