Express全系列教程之(五):Express的中间件
一、中間件
從字面意思,我們可以了解到它大概就是做中間代理操作,事實也是如此;大多數情況下,中間件就是在做接收到請求和發送響應中間的一系列操作。事實上,express是一個路由和中間件的web框架,Express 應用程序基本上是一系列中間件函數的調用。
?
中間件函數可以執行以下任務:
執行任何代碼。
對請求和響應對象進行更改。
結束請求/響應循環。
調用堆棧中的下一個中間件函數。
?
中間件也分為應用層中間件、路由中間件、內置中間件、錯誤處理中間件和第三方中間件。下面分別對以下進行說明:
?
1.應用層中間件
應用級中間鍵綁定到app對象使用app.use和app.METHOD()-需要處理http請求的方法,例如GET、PUT、POST,將之前的get或者post替換為use就行。
例如下面實例:
這時我們會發現http://localhost:8080/地址一直在加載,但命令行里顯示了“訪問之前”,說明程序并不會同步執行,如果使用next來是路由繼續向下匹配,那么就能又得到主頁數據了:
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);當然也可以簡化寫法:
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();
var router = express.Router()在匹配路由時,我們使用 router.use() 或 router.VERB() ,路由中間件結合多次callback可用于用戶登錄及用戶狀態檢測。
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);總之在檢測用戶登錄和引導用戶應該訪問哪個頁面是,路由中間件絕對好用。
?
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中間件類型,在實際項目中,中間件都是必不可少的,因此熟悉使用各種中間件會加快項目的開發效率。
轉載于:https://www.cnblogs.com/lpxj-blog/p/10713496.html
總結
以上是生活随笔為你收集整理的Express全系列教程之(五):Express的中间件的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: js正则相关知识点专题
 - 下一篇: React state和props使用