成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Node.js 多模塊共享數(shù)據(jù)庫(kù)連接

zhouzhou / 2518人閱讀

摘要:本文介紹了在項(xiàng)目中不同模塊之間共享數(shù)據(jù)庫(kù)連接的方法。專門(mén)負(fù)責(zé)和數(shù)據(jù)庫(kù)交互,用戶和航班這兩個(gè)模塊都需要連接數(shù)據(jù)庫(kù),一開(kāi)始我的代碼是這樣的引用連接數(shù)據(jù)庫(kù)引用連接數(shù)據(jù)庫(kù)且不說(shuō)這種寫(xiě)法一點(diǎn)都不,這種方式本身就是錯(cuò)誤的。

本文介紹了在 Node.js 項(xiàng)目中不同模塊之間共享數(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)手寫(xiě)了。最后寫(xiě)完我會(huì)把代碼放到 Github 上,歡迎大家批評(píng)指正。

數(shù)據(jù)庫(kù)方面,以為我比較熟悉和喜歡 JSON (SQL 沒(méi)學(xué)好就承認(rèn)唄-_-#),所以就選擇了 MongoDB。Node + Mongo 是近幾年越來(lái)越熱門(mén)的后端組合,網(wǎng)上有很多關(guān)于如何一起使用的資料。但為了節(jié)約時(shí)間(課程設(shè)計(jì)也就一個(gè)多星期),把精力多集中在系統(tǒng)和邏輯上,我用了 Mongoose 這個(gè)專門(mén)用于 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 專門(mén)負(fù)責(zé)和數(shù)據(jù)庫(kù)交互,用戶和航班這兩個(gè)模塊都需要連接數(shù)據(jù)庫(kù),一開(kāi)始我的代碼是這樣的:

// ----- 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ō)這種寫(xiě)法一點(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ò)誤是:嘗試打開(kāi)未關(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 類(lèi)似 -----
// ... 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 上面看到的。如果你有更好的方法,歡迎在評(píng)論中分享給大家!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/18694.html

相關(guān)文章

  • 什么是Node.js

    Node.js從2009年誕生至今,已經(jīng)發(fā)展了兩年有余,其成長(zhǎng)的速度有目共睹。從在github的訪問(wèn)量超過(guò)Rails,到去年底Node.jsS創(chuàng)始人Ryan Dalh加盟Joyent獲得企業(yè)資助,再到今年發(fā)布Windows移植版本,Node.js的前景獲得了技術(shù)社區(qū)的肯定。InfoQ一直在關(guān)注Node.js的發(fā)展,在今年的兩次Qcon大會(huì)(北京站和杭州站)都有專門(mén)的講座。為了更好地促進(jìn)Node.j...

    CrazyCodes 評(píng)論0 收藏0
  • Node 基礎(chǔ)學(xué)習(xí)

    摘要:既然這樣,怎么理解中的單線程再捋一捋和的關(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 的模...

    alaege 評(píng)論0 收藏0
  • 系列3|走進(jìn)Node.js進(jìn)程模型

    摘要:例如,在方法中,如果需要主從進(jìn)程之間建立管道,則通過(guò)環(huán)境變量來(lái)告知從進(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è)處理過(guò)程,它僅僅用到單進(jìn)程模型。那么如何讓 Web 應(yīng)用擴(kuò)展到...

    snowell 評(píng)論0 收藏0
  • Electron初步【01】--主進(jìn)程VS渲染進(jìn)程&不同頁(yè)面間共享數(shù)據(jù)

    摘要:主進(jìn)程渲染進(jìn)程主進(jìn)程在中,跑里的主腳本的進(jìn)程叫作主進(jìn)程。主進(jìn)程負(fù)責(zé)掌管所有的頁(yè)面和它們相應(yīng)的渲染進(jìn)程。不同頁(yè)面間共享數(shù)據(jù)非常簡(jiǎn)單,使用就能完成。 Electron使用了網(wǎng)頁(yè)頁(yè)面作為App的GUI,因此你可以將它看做是一個(gè)由JavaScript控制的一個(gè)小型的Chrome內(nèi)核瀏覽器。 主進(jìn)程VS渲染進(jìn)程 主進(jìn)程 在Electron中,跑package.json里的主腳本的進(jìn)程叫作主進(jìn)程。...

    Ajian 評(píng)論0 收藏0
  • 深入理解Node.js 進(jìn)程與線程(8000長(zhǎng)文徹底搞懂)

    摘要:在單核系統(tǒng)之上我們采用單進(jìn)程單線程的模式來(lái)開(kāi)發(fā)。由進(jìn)程來(lái)管理所有的子進(jìn)程,主進(jìn)程不負(fù)責(zé)具體的任務(wù)處理,主要工作是負(fù)責(zé)調(diào)度和管理。模塊與模塊總結(jié)無(wú)論是模塊還是模塊,為了解決實(shí)例單線程運(yùn)行,無(wú)法利用多核的問(wèn)題而出現(xiàn)的。 前言 進(jìn)程與線程是一個(gè)程序員的必知概念,面試經(jīng)常被問(wèn)及,但是一些文章內(nèi)容只是講講理論知識(shí),可能一些小伙伴并沒(méi)有真的理解,在實(shí)際開(kāi)發(fā)中應(yīng)用也比較少。本篇文章除了介紹概念,通過(guò)...

    Harpsichord1207 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<