摘要:本文介紹了在項目中不同模塊之間共享數據庫連接的方法。專門負責和數據庫交互,用戶和航班這兩個模塊都需要連接數據庫,一開始我的代碼是這樣的引用連接數據庫引用連接數據庫且不說這種寫法一點都不,這種方式本身就是錯誤的。
本文介紹了在 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 應用的多個模塊共享數據庫連接的一種方法。是我在 StackOverflow 上面看到的。如果你有更好的方法,歡迎在評論中分享給大家!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/18694.html
Node.js從2009年誕生至今,已經發展了兩年有余,其成長的速度有目共睹。從在github的訪問量超過Rails,到去年底Node.jsS創始人Ryan Dalh加盟Joyent獲得企業資助,再到今年發布Windows移植版本,Node.js的前景獲得了技術社區的肯定。InfoQ一直在關注Node.js的發展,在今年的兩次Qcon大會(北京站和杭州站)都有專門的講座。為了更好地促進Node.j...
摘要:例如,在方法中,如果需要主從進程之間建立管道,則通過環境變量來告知從進程應該綁定的相關的文件描述符,這個特殊的環境變量后面會被再次涉及到。 文:正龍(滬江網校Web前端工程師)本文原創,轉載請注明作者及出處 之前的文章走進Node.js之HTTP實現分析中,大家已經了解 Node.js 是如何處理 HTTP 請求的,在整個處理過程,它僅僅用到單進程模型。那么如何讓 Web 應用擴展到...
摘要:主進程渲染進程主進程在中,跑里的主腳本的進程叫作主進程。主進程負責掌管所有的頁面和它們相應的渲染進程。不同頁面間共享數據非常簡單,使用就能完成。 Electron使用了網頁頁面作為App的GUI,因此你可以將它看做是一個由JavaScript控制的一個小型的Chrome內核瀏覽器。 主進程VS渲染進程 主進程 在Electron中,跑package.json里的主腳本的進程叫作主進程。...
摘要:在單核系統之上我們采用單進程單線程的模式來開發。由進程來管理所有的子進程,主進程不負責具體的任務處理,主要工作是負責調度和管理。模塊與模塊總結無論是模塊還是模塊,為了解決實例單線程運行,無法利用多核的問題而出現的。 前言 進程與線程是一個程序員的必知概念,面試經常被問及,但是一些文章內容只是講講理論知識,可能一些小伙伴并沒有真的理解,在實際開發中應用也比較少。本篇文章除了介紹概念,通過...
閱讀 1421·2021-10-11 11:12
閱讀 3252·2021-09-30 09:46
閱讀 1638·2021-07-28 00:14
閱讀 3141·2019-08-30 13:49
閱讀 2589·2019-08-29 11:27
閱讀 3240·2019-08-26 11:52
閱讀 606·2019-08-23 18:14
閱讀 3441·2019-08-23 16:27