最近,本屌在試用Node.js,在尋找靠譜web框架時發現了Express.js。Express.js在Node.js社區中是比較出名web框架,而它的定位是「minimal and flexible(簡潔、靈活)」。html
Node有Http module,本質上,咱們能夠直接經過他寫Web應用。Http module使用很簡單:node
//////////////// // app.js //////////////// // 加載所需模塊 var http = require("http"); // 建立Server var app = http.createServer(function(request, response) { response.writeHead(200, { "Content-Type": "text/plain" }); response.end("Hello hyddd!\n"); }); // 啓動Server app.listen(1984, "localhost");
運行node app.js。訪問http://localhost:1984,便可看到「Hello hyddd!」。web
如今問題來了,Web須要經過不一樣uri區分功能,如:/user/profile 表示用戶信息,/about 表示網站簡介……,而Http module並無直接提供dispatch功能,固然,本身實現也不難:express
//////////////// // app1.js //////////////// // 加載所需模塊 var http = require("http"); // 建立Server var app = http.createServer(function(request, response) { if(request.url == '/'){ response.writeHead(200, { "Content-Type": "text/plain" }); response.end("Home Page!\n"); } else if(request.url == '/about'){ response.writeHead(200, { "Content-Type": "text/plain" }); response.end("About Page!\n"); } else{ response.writeHead(404, { "Content-Type": "text/plain" }); response.end("404 Not Found!\n"); } }); // 啓動Server app.listen(1984, "localhost");
若是要區別對待Http method,能夠根據 request.method 判斷。至此,Http module在此場景下的短板顯露無疑。編程
什麼是middleware?根據牛文《A short guide to Connect Middleware》裏定義,middleware就是一大坨handle requests的funcions。api
這裏說明下,middleware是一個概念;而上面的Connect,是一個Http Server Framework,基於Http module擴展,能夠說它是Express.js的前身。因此能夠把Connect等價看做Express.js。先看個Demo:app
//////////////// // app2.js //////////////// // 加載所需模塊 var express = require("express"); var http = require("http"); // 建立server var app = express(); // 增長一些middleware app.use(function(request, response, next) { console.log("step1, url:" + request.url); next(); }); app.use(function(request, response, next) { console.log("step2"); if(request.url == '/'){ response.writeHead(200, { "Content-Type": "text/plain" }); response.end("Main Page!\n"); } next(); }); app.use(function(request, response, next) { console.log("step2:"); console.log("step3"); if(request.url == '/about'){ response.writeHead(200, { "Content-Type": "text/plain" }); response.end("About Page!\n"); } }); // 啓動server http.createServer(app).listen(1984);
運行node app.js,訪問:http://localhost:1984/,console結果是:框架
step1,url:/編程語言
step2ide
Express經過 app.use 註冊middleware,middlewares至關於request的handlers,在處理request時,順序執行每個handler(function),handler業務完成後,經過調用next();,決定是否調用下一個handler,說白了就是 鏈 處理。
Middleware是Express.js很是重要的特性,沒有之一。基於這個特性,Express.js繼續實現了routing-dispatch(讓你能夠優雅地寫request處理函數), 公共的error處理(404,500處理),提供機制給開發者實施權限校驗機制等等。而在各類Express.js文檔中,這塊的篇幅是最長的,Express.js不少的變化和淫蕩技巧會在middleware獲得體現。
app2.js的裏,雖然經過middleware方式,把「/」和「/about」獨立出來,但和優雅的高可讀代碼還沒半毛錢關係。Routing是基於Middleware特性,它其實就是匹配不一樣的request到不一樣的handler上:
//////////////// // app3.js //////////////// var express = require("express"); var http = require("http"); var app = express(); app.all("*", function(request, response, next) { console.log("step1"); next(); }); app.get("/", function(request, response) { response.end("Home Page!"); }); app.get("/about", function(request, response) { response.end("About Page!"); }); app.get("*", function(request, response) { response.end("404!"); }); http.createServer(app).listen(1984);
這樣確實優雅了許多,至於更多的奇淫技巧能夠參看各類文檔。
額,Express加入了View處理機制,一塊兒看看:
var express = require("express"); var app = express(); // 模板目錄:./views app.set("views", __dirname + "/views"); // 使用jade引擎 app.set("view engine", "jade"); // 尋址views/index,提交jade渲染,並返回結果 app.get("/", function(request, response) { response.render("index", { message: "I'm hyddd" }); });
Express的View機制仍是簡單的。
我之因此稱其餘特性爲「小」特性,是由於他們相對前二者(特別是Routing),在框架中的地位都是次要的。
舉個栗子:response,Express的response基於Http.Server的response擴展,提供了一些新功能,如:response.redirect("/user/login"); 和 response.sendFile("/path/to/file");。
其餘的,你們能夠參考官方文檔。
Express正如官網中的描述同樣「minimal and flexible」。Express主要解決了 請求路由 和 視圖模板 的問題,其中Middleware是它最重要的概念。它是不錯的Web框架,但本屌仍是有些想法的:
1. Express不是MVC的框架,由於它沒有對Model解決方案。嗯,有點廢話,由於Express自己定位就不是MVC,只是minimal and flexible的Web框架。
2. 因爲Express實在是flexible,沒有強制的規範約束,加上js是能夠把代碼寫得很隨意的編程語言,因此本屌找到的Demo中,Config,Controller,View的維護、管理、技巧均可能各式各樣。
因此,沒有明確Model解決方案(固然你能夠找第三方的)和弱規範約束,使成天踩在別人(巨人)肩膀上的本屌開始時不太適應。
2. 《A short guide to Connect Middleware》
3. 《expressjs官方文檔》