亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        詳解Node.js模塊間共享數(shù)據(jù)庫(kù)連接的方法

        字號(hào):


            我們可以寫一個(gè)統(tǒng)一的數(shù)據(jù)庫(kù)連接模塊來(lái)供本地Node環(huán)境下各模塊間共享使用,接下來(lái)就來(lái)詳解Node.js模塊間共享數(shù)據(jù)庫(kù)連接的方法
            這個(gè)標(biāo)題本身就是一個(gè)命題,因?yàn)槭褂媚J(rèn)方式的情況下,一個(gè) Node.js 應(yīng)用里的各個(gè)模塊都是共享的同一個(gè)數(shù)據(jù)庫(kù)連接。但是如果姿勢(shì)不對(duì),可能會(huì)很丑陋,甚至可能會(huì)出錯(cuò)。
            你可以忽略下面這部分,直接切入正題。
            背景
            最近在做專業(yè)課程設(shè)計(jì),題目是“機(jī)票預(yù)訂管理系統(tǒng)”。需求比較簡(jiǎn)單,就試著拿最近在學(xué)的 Node.js 來(lái)做了。本來(lái)還在調(diào)研用何種 Node.js 框架比較合適,看了幾個(gè)框架之后發(fā)現(xiàn)這是殺雞用牛刀,有看文檔查資料的時(shí)間還不如直接動(dòng)手寫了。最后寫完我會(huì)把代碼放到 Github 上,歡迎大家批評(píng)指正。
            數(shù)據(jù)庫(kù)方面,以為我比較熟悉和喜歡 JSON (SQL 沒(méi)學(xué)好就承認(rèn)唄-_-#),所以就選擇了 MongoDB。Node + Mongo 是近幾年越來(lái)越熱門的后端組合,網(wǎng)上有很多關(guān)于如何一起使用的資料。但為了節(jié)約時(shí)間(課程設(shè)計(jì)也就一個(gè)多星期),把精力多集中在系統(tǒng)和邏輯上,我用了 Mongoose 這個(gè)專門用于 MongoDB 數(shù)據(jù)建模的 Node.js 擴(kuò)展,用它來(lái)大大減少操作數(shù)據(jù)庫(kù)的代碼。
            正題
            我建立了兩個(gè)數(shù)據(jù)模型(Model),一個(gè)是用戶(User),一個(gè)是航班(Flight),分別封裝到了 user.js, flight.js 這兩個(gè)模塊(Module)里面。Model 專門負(fù)責(zé)和數(shù)據(jù)庫(kù)交互,用戶和航班這兩個(gè)模塊都需要連接數(shù)據(jù)庫(kù),一開始我的代碼是這樣的:
            // ----- user.js -----
            // require mongoose.js 引用mongoose.js
            var M = require('mongoose');
            // connect to database 連接數(shù)據(jù)庫(kù)
            M.connect('mongodb://localhost/test');
            // ... some other code ...
            // ----- flight.js -----
            // require mongoose.js 引用mongoose.js
            var M = require('mongoose');
            // connect to database 連接數(shù)據(jù)庫(kù)
            M.connect('mongodb://localhost/test');
            // ... some other code ...
            // ----- models.js -----
            var user = require('./user'),
              flight = require('./flight');
            // ----- index.js -----
            var Models = require('./models');
            且不說(shuō)這種寫法一點(diǎn)都不 DRY,這種方式本身就是錯(cuò)誤的。當(dāng)我運(yùn)行 index.js 時(shí),會(huì)出現(xiàn)如下錯(cuò)誤。
            > node index.js
            > Connection error: { [Error: Trying to open unclosed connection.] state: 2 }
            錯(cuò)誤是:嘗試打開未關(guān)閉的連接。
            所以我們應(yīng)該在一個(gè)地方連接一次數(shù)據(jù)庫(kù),然后其他需要連接數(shù)據(jù)庫(kù)的模塊通過(guò)這個(gè)模塊來(lái)和數(shù)據(jù)庫(kù)交互。就好像插線板,義無(wú)反顧地吼叫道:“墻上就一個(gè)插座,你們不要搶了!放著我來(lái)!你們。。。就可以了!”
            具體方案
            我們把連接數(shù)據(jù)庫(kù)的動(dòng)作放到一個(gè)模塊里,并且把連接暴露給整個(gè)應(yīng)用中的其他模塊,然后其他需要連接數(shù)據(jù)庫(kù)的模塊引用這個(gè)連接即可。
            // ----- database.js -----
            var M = require('mongoose');
            M.connect('mongodb://localhost/test');
            // reference to the database connection 為這個(gè)連接創(chuàng)建一個(gè)引用
            var db = M.connection;
            // expose to modules that require database.js 把這個(gè)引用暴露給引用 database 模塊的其他模塊
            module.exports = db;
            // ----- user.js ----- flight.js 類似 -----
            // ... some other code ...
            // 我們會(huì)在 models.js 中,把數(shù)據(jù)庫(kù)連接的引用作為參數(shù)傳進(jìn)來(lái)
            module.exports = function( db ){
              if( db ){
                // ... do things with the connection ... 如果連接了數(shù)據(jù)庫(kù),就可以執(zhí)行數(shù)據(jù)庫(kù)相關(guān)的操作了
              }
            }
            // ----- models.js -----
            // require database module, retrieve the reference to database connection 引用 databse 模塊,獲取數(shù)據(jù)庫(kù)連接的引用
            var db = require('./database');
            // 把數(shù)據(jù)庫(kù)連接的引用傳入需要連接數(shù)據(jù)庫(kù)的模塊,任務(wù)完成!
            var user = require('./user')( db ),
              flight = require('./flight')( db );
            這就是讓一個(gè) Node.js 應(yīng)用的多個(gè)模塊共享數(shù)據(jù)庫(kù)連接的一種方法。是我在 StackOverflow 上面看到的。