Express 4.x較Express 3.x進行了較大的改動,原來基於Express 3.x的項目沒法直接升級到 4.x。本文對Express網站的內容進行了簡單的總結,但願可以幫助你們更好的瞭解Express 4.x,同時方便你們遷移。html
一、從新撰寫Express內核,取消了原來對於Connect的依賴
二、移除了大部分Build-in的Middleware
三、Middleware能夠僅對特定url前綴的請求執行,而且支持url中的參數
四、對Routing系統的擴展node
Express 3.x是基於Connect構建的。重構後的Express 4.x取消了對Connect的依賴,變成了徹底獨立的模塊。但因爲採用一致的Middleware處理方法,新的Express 4.x仍然對Connect的全部Middleware向下兼容,因此在Express中仍然可使用Connect的Middleware。git
Express 4.x的理念是僅專一於最核心的routing功能,而將其餘組建的選擇所有交由用戶配置,一方面提供更好的靈活和定製性,另外一方面能夠始終讓用戶使用最新的Middleware而將其和Express的更新獨立開來。其核心中僅保留了express.static,其他Middleware均須要經過npm安裝而且require。下表中是主要移除的模塊列表:github
完整列表請參見:https://github.com/senchalabs/connect#middleware.express
app.use('/users/:id', function(req, res, next) { console.log('ID:', req.params.id); next(); })
‘/users/:id’被視做請求url的前綴,凡是以此前綴的請求(例如:’/users/yeelan0319/daily’)等等均會通過這個Middleware的處理。(與Route中的url不一樣,route中必須徹底匹配)
注:此時獲得的req.path是除去前綴後的內容npm
本來在Express 3.x中須要app.use(app.router),而無關於app.get()等定義的位置,這形成了必定的混亂。4中完全取消了上述命令的引用,嚴格按照定義的順序執行use,get或者其餘的http請求。json
app.route()方法更好的支持了REST風格的接口,減小了輸入錯誤的風險,加強代碼可讀性。不得不說是很是美麗的一個解決方案!segmentfault
app.route('/book') .get(function(req, res) { res.send('Get a random book'); }) .post(function(req, res) { res.send('Add a book'); }) .put(function(req, res) { res.send('Update the book'); })
詳細能夠參考Express Route文檔。http://expressjs.com/4x/api.html#routerapi
express.Router是一個完整的具備Middleware和路由Routing的對象。經過app
var router = require('express').Router()
實例化後,可使用router.use()和router.get()等方法,定義一個完整的Node模塊,再將router exports出去。這樣實質上是定義了一個大的應用中的「微型應用」。
新的Expess 4中不在須要使用Node的HTTP.createServer(...).listen。能夠直接使用app.listen啓動監聽。
在Express 4.x下generator仍然使用express命令,可是必須先卸載express 3.x從新安裝3後纔可使用。
npm uninstall -g express npm install -g express-generator
同時由generator生成的app.js文件再也不執行後啓動監聽,而是一個獨立的Node模塊。因此啓動的方法發生了些微的變化。
咱們能夠從package.json中看到:
"scripts": { "start": "node ./bin/www" },
那麼bin/www下這個文件是什麼內容呢?
#!/usr/bin/env node var debug = require('debug')('app4'); var app = require('../app'); app.set('port', process.env.PORT || 3000); var server = app.listen(app.get('port'), function() { debug('Express server listening on port ' + server.address().port); });
內容很是簡單,require app.js這個模塊,而且啓動監聽端口。若是但願改回Express 3.x的啓動方式只須要將這部分的邏輯遷移回app.js中便可。
一、安裝對應的Middleware。注意即便是上表中的對應也僅應看成爲參考,由於有可能因爲Middleware的升級而致使參數和返回值的變化,切忌盲目的直接安裝並應用到生產環境中。
二、不須要再使用HTTP.createServer()方法,同時也不要require http模塊了
三、不須要再使用app.use(app.router),將本來放在這句命令如下的Middleware移至get/post等HTTP verb的後面
四、從新安裝express generator
五、仔細參考https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x?_ga=1.142997621.1756390127.1409921139
總體來講,express 4提供的功能更爲簡潔和強大,仍是很是值得深刻去了解和使用的。從開始使用express到如今僅僅兩個月的時間版本已經從當時的4.4躍升至了4.8。