Express全系列教程之(五):Express的中間件

1、中間件

從字面意思,咱們能夠了解到它大概就是作中間代理操做,事實也是如此;大多數狀況下,中間件就是在作接收到請求和發送響應中間的一系列操做。事實上,express是一個路由和中間件的web框架,Express 應用程序基本上是一系列中間件函數的調用。javascript

 

中間件函數能夠執行如下任務:
執行任何代碼。
對請求和響應對象進行更改。
結束請求/響應循環。
調用堆棧中的下一個中間件函數。html

 

中間件也分爲應用層中間件、路由中間件、內置中間件、錯誤處理中間件和第三方中間件。下面分別對如下進行說明:java

 

1.應用層中間件

應用級中間鍵綁定到app對象使用app.use和app.METHOD()-須要處理http請求的方法,例如GET、PUT、POST,將以前的get或者post替換爲use就行。
例以下面實例:web

const express=require("express");

var app=express();

//匹配路由以前的操做
app.use(function(req,res){
	console.log("訪問以前");
});

app.get("/",function(req,res){
	res.send("主頁");
});

app.listen(8080);

這時咱們會發現http://localhost:8080/地址一直在加載,但命令行裏顯示了「訪問以前」,說明程序並不會同步執行,若是使用next來是路由繼續向下匹配,那麼就能又獲得主頁數據了:express

const express=require("express");

var app=express();

//匹配路由以前的操做
app.use(function(req,res,next){
	console.log("訪問以前");
	next();
});

app.get("/",function(req,res){
	res.send("主頁");
});

app.listen(8080);

  固然也能夠簡化寫法:json

const express=require("express");

var app=express();

app.use(function(req,res,next){
	console.log("訪問以前");
	next();
},function(req,res){
	res.send("主頁");
});

app.listen(8080);

  所以,在進行路由匹配以前或再錄又要繼續向下執行時想作個操做,那麼應用層中間件無疑是好的選擇。數組

 

2.路由中間件

路由級中間件和應用級中間件相似,只不過他須要綁定express.Router();cookie

var router = express.Router()

  在匹配路由時,咱們使用 router.use() 或 router.VERB() ,路由中間件結合屢次callback可用於用戶登陸及用戶狀態檢測。session

const express = require("express");
var app = express();
var router=express.Router();

router.use("/",function(req,res,next){
	console.log("匹配前");
	next();
});

router.use("/user",function(req,res,next){
	console.log("匹配地址:",req.originalUrl);
	next();
},function(req,res){
	res.send("用戶登陸");
});

app.use("/",router);

app.listen(8080);

  總之在檢測用戶登陸和引導用戶應該訪問哪一個頁面是,路由中間件絕對好用。app

 

3.錯誤處理中間件

顧名思義,它是指當咱們匹配不到路由時所執行的操做。錯誤處理中間件和其餘中間件基本同樣,只不過其須要開發者提供4個自變量參數。

app.use((err, req, res, next) => {
        res.sendStatus(err.httpStatusCode).json(err);
});

  通常狀況下,咱們把錯誤處理放在最下面,這樣咱們便可對錯誤進行集中處理。

const express=require("express");

var app=express();

app.get("/",function(req,res,next){
	const err=new Error('Not Found');
	res.send("主頁");
	next(err);
});

app.use("/user",function(err,req,res,next){
	console.log("用戶登陸");
	next(err);
},function(req,res,next){
	res.send("用戶登陸");
	next();
});

app.use(function(req,res){
	res.status(404).send("未找到指定頁面");
});

app.listen(8080);

  

4.內置中間件

從版本4.x開始,Express再也不依賴Content,也就是說Express之前的內置中間件做爲單獨模塊,express.static是Express的惟一內置中間件。

express.static(root, [options]);

  經過express.static咱們能夠指定要加載的靜態資源。root表明加載靜態資源的路徑,options做爲可選參數擁有一下屬性:

 
屬性 描述 類型 缺省值
dotfiles 是否對外輸出文件名以點(.)開頭的文件。有效值包括「allow」、「deny」和「ignore」 字符串 「ignore」
etag 啓用或禁用 etag 生成 布爾 true
extensions 用於設置後備文件擴展名。 數組 []
index 發送目錄索引文件。設置爲 false 可禁用創建目錄索引。 混合 「index.html」
lastModified 將 Last-Modified 的頭設置爲操做系統上該文件的上次修改日期。有效值包括 true 或 false。 布爾 true
maxAge 設置 Cache-Control 頭的 max-age 屬性(以毫秒或者 ms 格式中的字符串爲單位) 數字 0
redirect 當路徑名是目錄時重定向到結尾的「/」。 布爾  
setHeaders 用於設置隨文件一塊兒提供的 HTTP 頭的函數。 函數 true

如下示例將使用了 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));

5.第三方中間件

形如以前咱們的body-parser,採用引入外部模塊的方式來得到更多的應用操做。如後期的cookie和session。

var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');

  以上就是關於express中間件類型,在實際項目中,中間件都是必不可少的,所以熟悉使用各類中間件會加快項目的開發效率。

相關文章
相關標籤/搜索