【譯】從 Express 3.x 遷移到 4.x

Express 3.x 到 4.0 的遷移指南。你可能對這篇文章也有興趣4.x版中的新功能html

更多的例子和完整的API文檔,請參見Express 4.x 的文檔node

概述

Express 4 再也不依賴 Connect 。這意味着全部捆綁的中間件(除了static)都再也不能從express模塊中被調用。這些中間件均可以做爲下面說起的模塊進行調用。這一變化是爲了讓這些中間件在獲取修復,更新和發佈的同時不影響 express 的發佈週期,反之亦然。git

其餘模塊在這裏 https://github.com/senchalabs/connect#middlewaregithub

移除

app.configure()

這種方法再也不可用。若是你想配置基於環境的不一樣路由,使用 if 語句或替代模塊。express

app.configure('development', function() {
   // configure stuff here
});
// 如今改成
var env = process.env.NODE_ENV || 'development';
if ('development' == env) {
   // configure stuff here
}

app.router

這個中間件已經全面改版,以此避免.use.get之間的混淆(或者是其餘HTTP動做),同時,再也不須要手動聲明的app.use(app.router)(已被移除)。查看下面關於新的中間件和路由 API 的一節。json

若是你的代碼看起來像這樣:api

app.use(cookieParser());
app.use(bodyParser());
/// 其餘的中間件,並無影響
app.use(app.router); // <--- 這行會被移除

// 更多的中間件(在路由以後執行)
app.use(function(req, res, next);
// 處理錯誤的中間件
app.use(function(err, req, res, next) {});

app.get('/' ...);
app.post(...);

app.router已被移除,中間件和路由按照它們添加的順序被執行。在你的代碼中,你應該將本來在app.use(app.router)以後的向app.use的請求移動到其餘路由以後(HTTP動做)。數組

app.use(cookieParser());
app.use(bodyParser());
/// 其餘的中間件,並無影響

app.get('/' ...);
app.post(...);

// 更多的中間件(在路由後執行)
app.use(function(req, res, next);
// 處理錯誤的中間件
app.use(function(err, req, res, next) {});

express.createServer()

長期棄用。如今只要使用`express()'建立一個新的應用。瀏覽器

connect 中間件

除了express.static爲了便捷性直接封裝在 express 中,其餘全部 connect 的中間件都被分離到了獨立的模塊中。由此,每一個獨立的模塊均可以擁有本身的版本控制。cookie

connect 的補丁

Connect 對 node 的原型進行了全局的改動。
這被認爲是不正確的,因此在 Connect 3 中已被移除。
其中一些補丁是:

  • res.on('header')
  • res.charset
  • res.headerSent - use node's res.headersSent instead

你不該該在任何 Connect 或 Express 的庫中再使用這些。

res.charset

若是你想快速設置默認的字符集(你確實應該這麼作),
使用 res.set('content-type') 或者 res.type() 來設置 header 。
當使用res.setHeader()時,默認的字符集將不會添加。

改動

app.use

app.use 如今能夠接受 :params.

app.use('/users/:user_id', function(req, res, next) {
  // req.params.user_id 能夠正確獲取
});

req.accepted()

使用req.accepts()來代替。

  • req.accepts()
  • req.acceptsEncodings()
  • req.acceptsCharsets()
  • req.acceptsLanguages()

都在內部使用 accepts
請參考accepts來提交問題或者查看文檔。

請注意,這些屬性可能已經從數組改成函數。
要把它們做爲「數組」使用,只要不向它們傳遞任何參數便可。
例如, req.acceptsLanguages() // => ['en', 'es', 'fr'].

res.location()

再也不作相對路徑的 URL 解析。瀏覽器自身將處理相對路徑的 URL 。

app.route -> app.mountpath

當把一個 express 應用安裝到另外一個 express 應用中時。

配置改動

  • json spaces 在開發模式下再也不默認啓用。

req.params

如今它是一個對象而不是數組。若是你之前使用req.params[##]的形式,這不會破壞你的應用,它能夠在不知道參數名的狀況下,使用正則來處理路由。

res.locals

再也不是一個函數。如今這是一個普通的JS對象。因此把它看成普通的對象來處理。

res.headerSent

改成headersSent來匹配 node.js 的 ServerResponse 對象。你的應用可能並無使用到這個,所以它不會是一個問題。

req.is

如今在內部使用 type-is
請參考type-is來提交問題或者查看文檔。

新加入

app.route(path)

返回一個新的Route的實例。當收到和這個路由的path相匹配的請求時,這個路由就會被調用。路由能夠有本身的中間件和針對 HTTP 動做的方法來處理請求。

請參閱路由和路由線路文檔,以便更好地瞭解如何在 express 中建立路由。

Router 和 Route 中間件

Router 已經全面改版,如今它是一個功能完善的中間件路由。Router 是在不犧牲參數匹配和中間件的狀況下,將你的路由分離到多個文件或者模塊的好方法。請參閱 Routes 及路由文檔

相關文章
相關標籤/搜索