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 上面看到的。若是你有更好的方法,歡迎在評論中分享給你們!

相關文章
相關標籤/搜索