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。