国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

zhouzhou / 2508人閱讀

摘要:本文介紹了在項(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

相關(guān)文章

  • 什么是Node.js

    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...

    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)程之間建立管道,則通過環(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ò)展到...

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

    摘要:主進(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)程。...

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

    摘要:在單核系統(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)用也比較少。本篇文章除了介紹概念,通過...

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

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

0條評(píng)論

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