遷移到 Express 4.x

遷移到 Express 4.x

概覽

從 Express 3 到Express 4 是一個巨大的變化,這意味着現存的 Express 3 應用在不更新依賴的狀況下將不能工做。html

 這篇文章涵蓋一下內容:node

  • Express 4 中的變化git

  • 一個從 Express 3 遷移到 Express 4 的示例github

  • 升級到 Express 4 的應用生成器express

 

Express 4 中的變化

主要的變化以下:npm

  • Express 的核心和中間件系統:對 Connect 和內建中間件的依賴被移除了。因此你必須本身添加中間件。json

  • 路由系統數組

  • 其它瀏覽器

參見:cookie

  • 4.X 中的新特性

  • 從 3.X 遷移到 4.X

Express 的核心和中間件系統

Express 4 再也不依賴 Connect,而且從核心中移除了全部內建的中間件,除了 express.static 以外。這意味着 Express 如今是一個不依賴路由和中間件的 Web 框架。這樣 Express 的版本化和發佈就再也不受到中間件的影響。

 

隨着內建的中間件被移除,你必須顯式添加全部依賴的中間件來運行你的應用,簡單來講須要如下步驟:

  1. 安裝模塊:npm install –save 模塊名稱

  2. 在你的應用中,使用這個模塊: require( 模塊名稱 )

  3. 基於模塊的文檔來使用模塊

 

下表列出了 Express 3 中對應 Express 4 中的模塊

 

 

Express 3 Express 4
express.bodyParser body-parser + multer
express.compress compression
express.cookieSession cookie-session
express.cookieParser cookie-parser
express.logger morgan
express.session express-session
express.favicon serve-favicon
express.responseTime response-time
express.errorHandler errorhandler
express.methodOverride method-override
express.timeout connect-timeout
express.vhost vhost
express.csrf csurf
express.directory serve-index
express.static serve-static
express.timeout connect-timeout

 

完整的列表見這裏:  https://github.com/senchalabs/connect#middleware

多數狀況下,你可使用 Express 4 中對應 Express 3 的模塊來替換老的模塊,詳細的說明見 GitHub 中文檔的說明

App.use 接受的參數

在 Express 4 中,如今你可使用帶有一個可變參數的路徑來加載中間件,而且從路由處理器中讀取參數的值,例如: 

app.use('/book/:id', function(req, res, next) {
  console.log('ID:', req.params.id);
  next();
})

 

路由系統

應用隱式加載路由中間件,因此,如今你沒必要擔憂 router 路由中間件加載的次序問題。

定義路由的方式沒有發生變化,如今增長了兩個新的特性來幫助組織路由系統。

  • 新的方法 route,針對一個路由路徑建立鏈式的路由處理器。

  • 新的類 express.Router,建立模塊化的路由處理器

 

app.route 方法

新的 app.route 方法對特定的路由路徑建立鏈式的路由處理器。因爲能夠在一個地方定義路徑,這樣有助於建立模塊話的路由規則,減小重複。

路由的詳細信息,能夠參見 Route() 的文檔。

 

下面的示例演示了路由的鏈式定義

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.Router 類

另一個幫助組織路由的特性是新的類 express.Router,能夠幫助建立模塊話的路由處理器。一個 Router 的實例就是一個完整的中間件和路由系統,因爲這個緣由,它常常被稱爲 迷你應用。

下面演示了建立一個名爲 bird.js 的路由文件,內容以下:

 

var express = require('express');var router = express.Router();// middleware specific to this routerrouter.use(function timeLog(req, res, next) {
  console.log('Time: ', Date.now());
  next();
})// define the home page routerouter.get('/', function(req, res) {
  res.send('Birds home page');
})// define the about routerouter.get('/about', function(req, res) {
  res.send('About birds');
})

module.exports = router;

 

而後在應用中加載這個路由模塊。

var birds = require('./birds');
...
app.use('/birds', birds);

這個應用如今能夠處理請求 /birds 和 /birds/about,還能夠調用 timeLog 中間件。

其它變化

下表列出了其它小的可是重要的修改

對象

說明

Node

Express 4 須要 Node 0.10.x 及其以上版本,已經不支持 0.8.x

http.createServer

再也不須要 http 模塊,應用使用 app.listen() 啓動

app.configure()

app.configure() 已經被移除,使用 process.env.NODE_ENV 或者 app.get(「env」) 來檢測環境、配置應用

json.spaces()

在 Express 4 中默認禁用了 json spaces

Req.location()

再也不能獲取相對 url

Req.params

原來是一個數組,如今是對象

Res.locals

原來是函數,如今是對象

Res.headerSent

修改成 res.headersSent

App.route

如今做爲 app.mountpath 存在

Res.on(「header」)

刪除

Res.charset

刪除

Res.setHeader(「Set-Cookie」, val)

這個功能如今限制爲設置基本的 cookie 值,使用 res.cookie() 的添加功能

 

示例

這裏是一個從 Express 3 升級到 Express 4 的示例。

Version 3 app

app.js

原來的 app.js 以下:

var express = require('express');var routes = require('./routes');var user = require('./routes/user');var http = require('http');var path = require('path');var app = express();// all environmentsapp.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.methodOverride());
app.use(express.session({ secret: 'your secret here' }));
app.use(express.bodyParser());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));// development onlyif ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

package.json 以下所示

{  "name": "application-name",  "version": "0.0.1",  "private": true,  "scripts": {    "start": "node app.js"
  },  "dependencies": {    "express": "3.12.0",    "jade": "*"
  }
}

遷移過程

在遷移以前,先安裝 Express 4 須要的中間件,還要更新 express,Jade 到最新的版本。

$ npm install serve-favicon morgan method-override express-session
body-parser multer errorhandler express@latest jade@latest --save

對 app.js 進行一下的修改。

1.  http 模塊已經使用了,因此,刪除 var http = require( "http" );

2. 內建的中間件 express.favicon, express.logger, express.methodOverride, express.session, express.bodyParser 和 express.errorHandler 已經不存在了,你必須手動安裝,而後在應用中替換它們。

3. 再也不須要加載 app.router ,實際上,它也已經不是 Express 4 中的對象,因此,刪除 app.use( app.router );

4. 使用 app.listen() 來取代 http.createServer 啓動。

Version 4 app

package.json

執行上面的命令,會以下更新 package.json 文件。

{  "name": "application-name",  "version": "0.0.1",  "private": true,  "scripts": {    "start": "node app.js"
  },  "dependencies": {    "body-parser": "^1.5.2",    "errorhandler": "^1.1.1",    "express": "^4.8.0",    "express-session": "^1.7.2",    "jade": "^1.5.0",    "method-override": "^2.1.2",    "morgan": "^1.2.2",    "multer": "^0.1.3",    "serve-favicon": "^2.0.1"
  }
}

app.js

而後,刪除無效的代碼,加載須要的中間件,完成其它必須的修改,最終的 app.js 看起來以下所示:

var express = require('express');var routes = require('./routes');var user = require('./routes/user');var path = require('path');var favicon = require('serve-favicon');var logger = require('morgan');var methodOverride = require('method-override');var session = require('express-session');var bodyParser = require('body-parser');var multer = require('multer');var errorHandler = require('errorhandler');var app = express();// all environmentsapp.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(methodOverride());
app.use(session({ resave: true,
                  saveUninitialized: true,
                  secret: 'uwotm8' }));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(multer());
app.use(express.static(path.join(__dirname, 'public')));// development onlyif ('development' == app.get('env')) {
  app.use(errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);

app.listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

運行應用

如今,遷移已經完成了,使用以下命令啓動。

$ node app

使用瀏覽器訪問 http://localhost:3000,查看使用 Express 4 生成的頁面。

升級到 Express 4 的應用生成器

生成一個 Express 4 的命令行工具仍是 express,可是,升級到新版本的話,須要先卸載 Express 3 的生成器,而後安裝新的生成器。

 

安裝

若是你已經安裝過 Express 3 的生成器,必須先卸載

npm uninstall –g express

依賴與你的目錄權限和配置,可能須要先執行 sudo 提高權限。

如今,安裝新的生成器

Npm install –g express-generator

如今,你係統中的 express 命令已經升級爲 Express 4 的生成器了。

生成器的變化

 除了下面的變化,基本上與之前相同。

--sessions 選項被刪除了

--jshtml 選項被刪除了

--hogan 被添加,以便支持 Hogan.js

示例

執行下面的命令,建立 app4 應用

express app4

 若是你查看 app4 文件夾中的 app.js 文件,你會發現全部的中間件被替換爲獨立的中間件加載,router 中間件再也不顯式加載。

你還會注意到 app.js 如今是一個 Node 模塊。

安裝依賴的文件以後,使用下面的命令啓動應用。

$ npm start

 若是你查看 package.json 中的啓動腳本,你會注意到實際的啓動腳本是 node ./bin/www,在 Express 3 中是 node app.js

因爲 Express 4 新生成的 app.js 已是一個 Node 模塊,它能夠再也不須要經過一個獨立的應用來啓動,它能夠在 Node 文件中加載,經過 Node 文件啓動,這裏就是 ./bin/www

不論是 bin 文件夾,仍是 www 文件,他們都是手工由 Express 生成器生成的,因此,須要的話,均可以進行修改。

爲了與 Express 3 保持一致,刪除 module.experts = app;在 app.js 的最後,添加下面的代碼。

app.set('port', process.env.PORT || 3000);var server = app.listen(app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port);
});

 確認加載 debug 模塊。

var debug = require('debug')('app4');

 而後將 package.json 文件中的 start: "node ./bin/www" 修改成 "start": "node app.js"。

如今,已經從 ./bin/www 回到了 app.js。

相關文章
相關標籤/搜索