摘要:本文介紹了在項(xiàng)目中不同模塊之間共享數(shù)據(jù)庫連接的方法。專門負(fù)責(zé)和數(shù)據(jù)庫交互,用戶和航班這兩個(gè)模塊都需要連接數(shù)據(jù)庫,一開始我的代碼是這樣的引用連接數(shù)據(jù)庫引用連接數(shù)據(jù)庫且不說這種寫法一點(diǎn)都不,這種方式本身就是錯(cuò)誤的。
本文介紹了在 Node.js 項(xiàng)目中不同模塊之間共享數(shù)據(jù)庫連接的方法。
這個(gè)標(biāo)題本身就是一個(gè)命題,因?yàn)槭褂媚J(rèn)方式的情況下,一個(gè) Node.js 應(yīng)用里的各個(gè)模塊都是共享的同一個(gè)數(shù)據(jù)庫連接。但是如果姿勢(shì)不對(duì),可能會(huì)很丑陋,甚至可能會(huì)出錯(cuò)。
你可以忽略下面這部分,直接切入正題。
背景最近在做專業(yè)課程設(shè)計(jì),題目是“機(jī)票預(yù)訂管理系統(tǒng)”。需求比較簡(jiǎn)單,就試著拿最近在學(xué)的 Node.js 來做了。本來還在調(diào)研用何種 Node.js 框架比較合適,看了幾個(gè)框架之后發(fā)現(xiàn)這是殺雞用牛刀,有看文檔查資料的時(shí)間還不如直接動(dòng)手寫了。最后寫完我會(huì)把代碼放到 Github 上,歡迎大家批評(píng)指正。
數(shù)據(jù)庫方面,以為我比較熟悉和喜歡 JSON (SQL 沒學(xué)好就承認(rèn)唄-_-#),所以就選擇了 MongoDB。Node + Mongo 是近幾年越來越熱門的后端組合,網(wǎng)上有很多關(guān)于如何一起使用的資料。但為了節(jié)約時(shí)間(課程設(shè)計(jì)也就一個(gè)多星期),把精力多集中在系統(tǒng)和邏輯上,我用了 Mongoose 這個(gè)專門用于 MongoDB 數(shù)據(jù)建模的 Node.js 擴(kuò)展,用它來大大減少操作數(shù)據(jù)庫的代碼。
正題我建立了兩個(gè)數(shù)據(jù)模型(Model),一個(gè)是用戶(User),一個(gè)是航班(Flight),分別封裝到了 user.js, flight.js 這兩個(gè)模塊(Module)里面。Model 專門負(fù)責(zé)和數(shù)據(jù)庫交互,用戶和航班這兩個(gè)模塊都需要連接數(shù)據(jù)庫,一開始我的代碼是這樣的:
// ----- user.js ----- // require mongoose.js 引用mongoose.js var M = require("mongoose"); // connect to database 連接數(shù)據(jù)庫 M.connect("mongodb://localhost/test"); // ... some other code ... // ----- flight.js ----- // require mongoose.js 引用mongoose.js var M = require("mongoose"); // connect to database 連接數(shù)據(jù)庫 M.connect("mongodb://localhost/test"); // ... some other code ... // ----- models.js ----- var user = require("./user"), flight = require("./flight"); // ----- index.js ----- var Models = require("./models");
且不說這種寫法一點(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ù)庫,然后其他需要連接數(shù)據(jù)庫的模塊通過這個(gè)模塊來和數(shù)據(jù)庫交互。就好像插線板,義無反顧地吼叫道:“墻上就一個(gè)插座,你們不要搶了!放著我來!你們。。。就可以了!”
具體方案我們把連接數(shù)據(jù)庫的動(dòng)作放到一個(gè)模塊里,并且把連接暴露給整個(gè)應(yīng)用中的其他模塊,然后其他需要連接數(shù)據(jù)庫的模塊引用這個(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ù)庫連接的引用作為參數(shù)傳進(jìn)來 module.exports = function( db ){ if( db ){ // ... do things with the connection ... 如果連接了數(shù)據(jù)庫,就可以執(zhí)行數(shù)據(jù)庫相關(guān)的操作了 } } // ----- models.js ----- // require database module, retrieve the reference to database connection 引用 databse 模塊,獲取數(shù)據(jù)庫連接的引用 var db = require("./database"); // 把數(shù)據(jù)庫連接的引用傳入需要連接數(shù)據(jù)庫的模塊,任務(wù)完成! var user = require("./user")( db ), flight = require("./flight")( db );
這就是讓一個(gè) Node.js 應(yīng)用的多個(gè)模塊共享數(shù)據(jù)庫連接的一種方法。是我在 StackOverflow 上面看到的。如果你有更好的方法,歡迎在評(píng)論中分享給大家!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/18694.html
Node.js從2009年誕生至今,已經(jīng)發(fā)展了兩年有余,其成長(zhǎng)的速度有目共睹。從在github的訪問量超過Rails,到去年底Node.jsS創(chuàng)始人Ryan Dalh加盟Joyent獲得企業(yè)資助,再到今年發(fā)布Windows移植版本,Node.js的前景獲得了技術(shù)社區(qū)的肯定。InfoQ一直在關(guān)注Node.js的發(fā)展,在今年的兩次Qcon大會(huì)(北京站和杭州站)都有專門的講座。為了更好地促進(jìn)Node.j...
摘要:既然這樣,怎么理解中的單線程再捋一捋和的關(guān)系。在線程上,不會(huì)等待操作完成,繼續(xù)執(zhí)行后續(xù)的代碼。這就是單線程異步。在中除了代碼,一切都是并行的由于中主任務(wù)的執(zhí)行是以單線程的方式進(jìn)行,如果程序出錯(cuò)導(dǎo)致崩潰,就會(huì)終止整個(gè)流程。 node是什么 Node.js 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境。 Node.js 使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式 I/O 的模...
摘要:例如,在方法中,如果需要主從進(jìn)程之間建立管道,則通過環(huán)境變量來告知從進(jìn)程應(yīng)該綁定的相關(guān)的文件描述符,這個(gè)特殊的環(huán)境變量后面會(huì)被再次涉及到。 文:正龍(滬江網(wǎng)校Web前端工程師)本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明作者及出處 之前的文章走進(jìn)Node.js之HTTP實(shí)現(xiàn)分析中,大家已經(jīng)了解 Node.js 是如何處理 HTTP 請(qǐng)求的,在整個(gè)處理過程,它僅僅用到單進(jìn)程模型。那么如何讓 Web 應(yīng)用擴(kuò)展到...
摘要:主進(jìn)程渲染進(jìn)程主進(jìn)程在中,跑里的主腳本的進(jìn)程叫作主進(jìn)程。主進(jìn)程負(fù)責(zé)掌管所有的頁面和它們相應(yīng)的渲染進(jìn)程。不同頁面間共享數(shù)據(jù)非常簡(jiǎn)單,使用就能完成。 Electron使用了網(wǎng)頁頁面作為App的GUI,因此你可以將它看做是一個(gè)由JavaScript控制的一個(gè)小型的Chrome內(nèi)核瀏覽器。 主進(jìn)程VS渲染進(jìn)程 主進(jìn)程 在Electron中,跑package.json里的主腳本的進(jìn)程叫作主進(jìn)程。...
摘要:在單核系統(tǒng)之上我們采用單進(jìn)程單線程的模式來開發(fā)。由進(jìn)程來管理所有的子進(jìn)程,主進(jìn)程不負(fù)責(zé)具體的任務(wù)處理,主要工作是負(fù)責(zé)調(diào)度和管理。模塊與模塊總結(jié)無論是模塊還是模塊,為了解決實(shí)例單線程運(yùn)行,無法利用多核的問題而出現(xiàn)的。 前言 進(jìn)程與線程是一個(gè)程序員的必知概念,面試經(jīng)常被問及,但是一些文章內(nèi)容只是講講理論知識(shí),可能一些小伙伴并沒有真的理解,在實(shí)際開發(fā)中應(yīng)用也比較少。本篇文章除了介紹概念,通過...
閱讀 1411·2021-10-11 11:12
閱讀 3244·2021-09-30 09:46
閱讀 1633·2021-07-28 00:14
閱讀 3132·2019-08-30 13:49
閱讀 2581·2019-08-29 11:27
閱讀 3211·2019-08-26 11:52
閱讀 596·2019-08-23 18:14
閱讀 3435·2019-08-23 16:27