Node.js[5] connect & express簡介


前面幾篇反復提到“高質量模塊”;connect和express無論從代碼的結構、可讀性以及UT、文檔等各個方面,都是node模塊開發的榜樣。這篇文章基本是這份slide展開討論的縮減版,其中的源碼分析留在后續的《connect源碼分析》、《express源碼分析》中展開。

對connect和express的興趣來自於前不久組里的一個項目,當時遇到這些需求/糾結:

  • 項目需要web server
  • tomcat/apache太大,以至於無法短時間內摸清他們的實現細節
  • 剛好想了解web server實現細節
  • 一直覺得connect 中間件(middleware)這個名詞比較神秘大笑
  • 想了解node模塊開發、發布細節(這是中途產生的想法)

TJ 和他的 connect、express

connectexpress出自同一作者TJ Holowaychuk(之后簡稱TJ)。從依賴性看,express基於connect;但從2個項目的git提交歷史來看,實際上先有express項目(2009-6-27),2010-5-27 前后connect從express項目分化出來(express 0.12.0)。express 0.12.0這個版本實際上已經有了中間件(middleware)雛形,只不過當時還叫plugin,那時已經有了logger,static,session等中間件。

Node.js[1] 俯瞰NPM》中已經提到過TJ同學,這位node先鋒長久以來(至少半年)占據着npm registry “最高產作者”的榜單冠軍太棒了;“最多依賴模塊”前十位有2個來自TJ(正是connect和express) ;“最受歡迎模塊”前十位竟然有4個來自TJ。

Connect

Connect is a middleware framework for node.

Connect是一個node中間件(middleware)框架。如果把一個http處理過程比作是污水處理,中間件就像是一層層的過濾網。每個中間件在http處理過程中通過改寫request或(和)response的數據、狀態,實現了特定的功能。這些功能非常廣泛,下圖列出了connect所有內置中間件和部分第三方中間件。 這里能看到完整的中間件列表

下圖根據中間件在整個http處理流程的位置,將中間件大致分為

  1. Pre-Request 通常用來改寫request的原始數據
  2. Request/Response 大部分中間件都在這里,功能各異
  3. Post-Response 全局異常處理,改寫response數據等

 

為何要有connect?

下面的代碼展示了使用connect和node原生api寫一個靜態文件服務器:

/*
 * 使用connect實現的靜態文件處理
 */
var connect = require('connect');
connect(connect.static(__dirname + '/public')).listen(//監聽
    3000,
    function() {
        console.log('Connect started on port 3000');
    }
);
/*
 * 使用node原生api實現
 */
var http = require('http');
http.createServer(
    function(req, res) {
        var url = require('url');
        var fs = require('fs');
        var pathname = __dirname + '/public' + url.parse(req.url).pathname;
        //讀取本地文件
        fs.readFile(
            pathname,
            function(err, data) {
                //異常處理
                if (err) {
                    res.writeHead(500);
                    res.end('500');
                }
                else {
                    res.end(data);
                }
            }
        );
    }
).listen(//監聽
    3001,
    function() {
        console.log('http.Server started on port 3001');
    }
);

盡管node原生api已經花費這么些行代碼,但其實仍然留下一個簡單靜態文件服務器的諸多方面未經處理,比如:404等異常未處理、沒有基本的文件路徑安全驗證(實際上我們可以訪問到整個os文件系統)、全局異常處理等等;與此同時connect已經將這些問題都處理好了。

上面的例子是connect最初帶給我的興奮:寫得更少做得更多(呵呵,竄了,deli文具?jquery?)。connect真正難能可貴的還是其良好的架構、便捷高效的擴展性,更多的細節留在后續源碼分析。

這里再給出一些connect demo,有興趣的同學請繼續:

  • connect項目的examples
  • 筆者之前寫的demo(解壓后先運行npm install, demo在/connect中)

Express

Express: web application framework for node

Express是以web應用框架的面貌出現的,基於connect;准確說是在connect基礎上添加一個更接近業務開發的框架。下圖是express架構的簡要分解:

express提供的框架比較靈活,你可以在express基礎上實現MVC,也可以實現更多你希望的開發模式。express源碼下的examples給出了express的各種用法,其中就有MVC。

從圖中可以看到,express也實現了一些特殊的connect中間件

  • route middleware,實現路由
  • express.middleware,初始化express全局參數
  • mounted child app middleware,掛載子app

更多細節留在源碼分析中詳述。

最簡單的express demo代碼和connect太過相似,這里給出一些較復雜的express demo:

  • express項目的examples
  • 筆者之前寫的demo(解壓后先運行npm install, demo在/express中)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM