NodeJS的MVC是如何工作的?

之前在一篇博客中看到說NodeJS使用MongoDB可以在創建伺服器的時候連接Mongo,之後只需要直接使用就可以,不用重新連接。(當然,沒有示例代碼)

在網上下載了一個Demo發現它的源碼是寫了一個db模塊,但是這個db模塊並沒有open,而是在每個請求到來需要具體操作資料庫的時候才open,(之前做PHPer,這個很好理解),但打開Mongo日誌把我嚇了一大跳,每一次open都會創建5個連接,而且即便是請求結束之後,連接任然沒有被關閉。多點幾次頁面之後,連接就達到了幾百個。

所以對於新手來說,這一塊學得比較迷茫,雖然之前是PHPer,但我任然比較偏好前一種方式,試圖實現這種方式但可能自己對NodeJS的理解還有待加強,一直未能實現。

希望各位做NodeJS開發的大神能夠指點一二,NodeJS在實際項目中MVC是如何工作的?(其實重點講解一下M是如何工作的)。謝謝!


謝邀。

本人12年PHP經驗,4年多Node經驗。目前主要做JS相關技術。 我覺得Node相比起PHP來說,主要是構架方面的變化比較大。

以前做PHP的時候,伺服器處理一次請求是個很複雜的過程。首先Apache監聽80埠收到一個連接請求後,找PHP處理這個請求。PHP再來根據這個請求做具體的處理(連資料庫、讀寫文件、組織輸出等等),最後把輸出給到Apache,Apache再給瀏覽器。 這種構架下面,每次請求的處理都是相互獨立的。想要跨請求之間共享數據,只能用cookie, session 等傳遞一些字元串數據。

但是到了Node,一切都變了。一個js程序跑起來後,就起了一個上下文環境。處理請求只是這個js上下文裡面的某個函數。多次請求就會多次調用這個處理函數。相當於一個Node程序能幹的事情包含了 Apache和PHP 能做的事情。

在NodeJS下面,你也可以像LAMP構架下面對每次請求單獨處理。也可以隨便弄個全局變數,就可以跨請求傳遞任何類型的數據或者函數了。因為處理單次連接請求的只是你程序裡面的某個函數。這個函數就是一個普通的JS函數,有自己的上下文閉包等。

所以,在Node構架下面,一般是先連接資料庫,然後把這個連接的對象放到全局。這樣,每次獨立的請求都可以用這個連接對象。 並不需要每次請求重新連接資料庫。

如果想要更深入的體會這兩種構架的區別,你可以自己思考下怎樣在兩種構架分別實現一個簡單的聊天室。然後你會發現,NodeJS幾十行就可以搞定的事情,LAMP構架需要幾百甚至幾千行。而且NodeJS的負載能力可以達到LAMP構架的幾百甚至幾千倍。

我並不是想表達NodeJS就完全超越PHP。我覺得他們各自都有優缺點。在我看來NodeJS門檻高,太靈活,技術發展太快, 而PHP門檻低,簡單,穩定。


這個其實你在 db.open 之後再在它的 callback 里 open 你的 server 就可以了。

這樣把你的 db 傳入你的 server open 的方法,裡面你就可以拿著已經 Open 的 DB instance 來用了。 比如:

var DB = require("./db").DB,
ServerManager = require("./server").ServerManager;

DB.open(function(err, db) {
if (db) {
ServerManager.start(db);
}
});

其實,MVC 在 Node 里沒有什麼特別,就看你怎麼分層而已。你用一個 express,它可以幫你做 route 轉發,也就是可以綁定你的 Model,Controller 和 View 層了。用 Model 來接收傳來的參數,執行業務邏輯,再把結果返回到 View 層。這裡還要看你的 View 是在 server render 還是只是返回數據到 browser 來做一個 SPA。


推薦閱讀:

asp.net mvc 4 模型層為什麼可以通過簡單的 {get;set}就可以對數據進行設置和取得 這其中的實現原理是什麼?
MVC和三層架構有何區別和聯繫?
你對MVC、MVP、MVVM 三種組合模式分別有什麼樣的理解?
AngularJS 沒有元素選擇器算不算一個缺點?

TAG:JavaScript | Nodejs | MVC |