express中的中間件理解


什么是中間件

中間件是一個可訪問請求對象(req)和響應對象(res)的函數,在 Express 應用的請求-響應循環里,下一個內聯的中間件通常用變量 next 表示。中間件的功能包括:

執行任何代碼。

修改請求和響應對象。

終結請求-響應循環。

調用堆棧中的下一個中間件。

如果當前中間件沒有終結請求-響應循環,則必須調用 next() 方法將控制權交給下一個中間件,否則請求就會掛起。使用可選則掛載路徑,可在應用級別或路由級別裝載中間件。可裝載一系列中間件函數,在掛載點創建一個中間件系統棧。

中間件的類別

應用級中間件

應用級中間件綁定到 express 實例,使用 app.use() 和 app.VERB()

 1 var app = express();  2  3 // 沒有掛載路徑的中間件,應用的每個請求都會執行該中間件  4 app.use(function (req, res, next) {  5 console.log('Time:', Date.now());  6  next();  7 });  8  9 // 掛載至 /user/:id 的中間件,任何指向 /user/:id 的請求都會執行它 10 app.use('/user/:id', function (req, res, next) { 11 console.log('Request Type:', req.method); 12  next(); 13 }); 14 15 // 路由和句柄函數(中間件系統),處理指向 /user/:id 的 GET 請求 16 app.get('/user/:id', function (req, res, next) { 17 res.send('USER'); 18 });

在一個掛載點裝載一組中間件

// 一個中間件棧,對任何指向 /user/:id 的 HTTP 請求打印出相關信息
app.use('/user/:id', function(req, res, next) { console.log('Request URL:', req.originalUrl); next(); }, function (req, res, next) { console.log('Request Type:', req.method); next(); });

路由句柄的好處

 1 // 一個中間件棧,處理指向 /user/:id 的 GET 請求  2 app.get('/user/:id', function (req, res, next) {  3 console.log('ID:', req.params.id);  4  next();  5 }, function (req, res, next) {  6 res.send('User Info');  7 });  8  9 // 處理 /user/:id, 打印出用戶 id 10 app.get('/user/:id', function (req, res, next) { 11  res.end(req.params.id); 12 });

作為中間件系統的路由句柄,使得為路徑定義多個路由成為可能。在上面的例子中,為指向 /user/:id 的 GET 請求定義了兩個路由。第二個路由雖然不會帶來任何問題,但卻永遠不會被調用,因為第一個路由已經終止了請求-響應循環。

如果需要在中間件棧中跳過剩余中間件,調用 next(‘route’) 方法將控制權交給下一個路由。需要注意的是 next(‘route’) 只對使用 app.VERB() 或 router.VERB() 加載的中間件有效。

 1 // 一個中間件棧,處理指向 /user/:id 的 GET 請求  2 app.get('/user/:id', function (req, res, next) {  3 // 如果 user id 為 0, 跳到下一個路由  4 if (req.params.id == 0) next('route');  5 // 負責將控制權交給棧中下一個中間件  6 else next(); //  7 }, function (req, res, next) {  8 // 渲染常規頁面  9 res.render('regular'); 10 }); 11 12 // 處理 /user/:id, 渲染一個特殊頁面 13 app.get('/user/:id', function (req, res, next) { 14 res.render('special'); 15 });

路由級中間件

路由級中間件和應用級中間件一樣,只是它綁定的對象為 express.Router()

var router = express.Router();

路由級使用 router.use() 或 router.VERB() 加載。

上述在應用級創建的中間件系統,可通過如下代碼改寫為路由級:

var app = express(); var router = express.Router(); // 沒有掛載路徑的中間件,通過該路由的每個請求都會執行該中間件
router.use(function (req, res, next) { console.log('Time:', Date.now()); next(); }); // 一個中間件棧,顯示任何指向 /user/:id 的 HTTP 請求的信息
router.use('/user/:id', function(req, res, next) { console.log('Request URL:', req.originalUrl); next(); }, function (req, res, next) { console.log('Request Type:', req.method); next(); }); // 一個中間件棧,處理指向 /user/:id 的 GET 請求
router.get('/user/:id', function (req, res, next) { // 如果 user id 為 0, 跳到下一個路由
  if (req.params.id == 0) next('route'); // 負責將控制權交給棧中下一個中間件
  else next(); // 
}, function (req, res, next) { // 渲染常規頁面
  res.render('regular'); }); // 處理 /user/:id, 渲染一個特殊頁面
router.get('/user/:id', function (req, res, next) { console.log(req.params.id); res.render('special'); }); // 將路由掛載至應用
app.use('/', router);

錯誤處理中間件

錯誤處理中間件有 4 個參數,定義錯誤處理中間件時必須使用這 4 個參數。即使不需要 next 對象,也必須在簽名中聲明它,否則中間件會被識別為一個常規中間件,不能處理錯誤。

錯誤處理中間件和其他中間件定義類似,只是要使用 4 個參數,而不是 3 個,其簽名如下: (errreqresnext)。

app.use(function(err, req, res, next) { console.error(err.stack); res.status(500).send('Something broke!'); });

內置中間件

在 4.x 版本中,Express 已經不再依賴 Connect。除了 express.static,Express 以前包括的中間件現在已經在一個單獨的庫里,請參考API。

express.static(root[options])

express.static 是 Express 唯一內置的中間件,它基於 serve-static,負責在 Express 應用中提供靜態資源。 
參數 root 指提供靜態資源的根目錄。可選的 options 參數擁有如下屬性。

 

下面的例子使用了 express.static 中間件,其中的 options 對象經過了精心的設計。

var options = { dotfiles: 'ignore', etag: false, extensions: ['htm', 'html'], index: false, maxAge: '1d', redirect: false, setHeaders: function (res, path, stat) { res.set('x-timestamp', Date.now()); } } app.use(express.static('public', options));

每個應用可有多個靜態目錄。

app.use(express.static('public')); app.use(express.static('uploads')); app.use(express.static('files'));

第三方中間件

Express 是一款提供路由和中間件的 Web 框架,但其本身的功能卻異常精簡。Express 應用的功能通過第三方中間件來添加。安裝所需功能的 node 模塊,並在應用中加載,可以在應用級加載,也可以在路由級加載。下面的例子安裝並加載了一個解析 cookie 的中間件: cookie-parser

var express = require('express'); var app = express(); var cookieParser = require('cookie-parser'); // 加載 cookie 解析中間件
app.use(cookieParser());

在進行表單上傳的過程中,因為有可能會用到圖片的上傳,這時候cookie-parser不能滿足我們的要求,我們就需要新的三方插件,比如multiparty

1 1.npm i multiparty 2 2.const multiparty = require('multiparty'); 3 3.上傳圖片 4 let form = new multiparty.Form() 5 form.uploadDir = '';//指定圖片的文件夾 6 form.parse(req,function(err,fields,files){ 7 //獲取提交的數據以及圖片上傳成功返回的圖片信息 field是表單數據,files為圖片信息 8 })

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM