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

從字面意思,我們可以了解到它大概就是做中間代理操作,事實也是如此;大多數(shù)情況下,中間件就是在做接收到請求和發(fā)送響應(yīng)中間的一系列操作。事實上,express是一個路由和中間件的web框架,Express 應(yīng)用程序基本上是一系列中間件函數(shù)的調(diào)用。


中間件函數(shù)可以執(zhí)行以下任務(wù):

執(zhí)行任何代碼。

對請求和響應(yīng)對象進行更改。

結(jié)束請求/響應(yīng)循環(huán)。

調(diào)用堆棧中的下一個中間件函數(shù)。


中間件也分為應(yīng)用層中間件、路由中間件、內(nèi)置中間件、錯誤處理中間件和第三方中間件。下面分別對以下進行說明:

1.應(yīng)用層中間件

應(yīng)用級中間鍵綁定到app對象使用app.use和app.METHOD()-需要處理http請求的方法,例如GET、PUT、POST,將之前的get或者post替換為use就行。

例如下面實例:

const express=require("express");

var app=express();

//匹配路由之前的操作

app.use(function(req,res){

? ??console.log("訪問之前");

});

app.get("/",function(req,res){

? ?res.send("主頁");

});

app.listen(8080);

這時我們會發(fā)現(xiàn)http://localhost:8080/地址一直在加載,但命令行里顯示了“訪問之前”,說明程序并不會同步執(zhí)行,如果使用next來是路由繼續(xù)向下匹配,那么就能又得到主頁數(shù)據(jù)了:

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);

因此,在進行路由匹配之前或再錄又要繼續(xù)向下執(zhí)行時想做個操作,那么應(yīng)用層中間件無疑是好的選擇。


2.路由中間件

路由級中間件和應(yīng)用級中間件類似,只不過他需要綁定express.Router();

var router = express.Router();

在匹配路由時,我們使用 router.use() 或 router.VERB() ,路由中間件結(jié)合多次callback可用于用戶登錄及用戶狀態(tài)檢測。

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);

總之在檢測用戶登錄和引導用戶應(yīng)該訪問哪個頁面是,路由中間件絕對好用。


3.錯誤處理中間件

顧名思義,它是指當我們匹配不到路由時所執(zhí)行的操作。錯誤處理中間件和其他中間件基本一樣,只不過其需要開發(fā)者提供4個自變量參數(shù)。

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.內(nèi)置中間件

從版本4.x開始,Express不再依賴Content,也就是說Express以前的內(nèi)置中間件作為單獨模塊,express.static是Express的唯一內(nèi)置中間件。

express.static(root, [options]);

通過express.static我們可以指定要加載的靜態(tài)資源。root代表加載靜態(tài)資源的路徑,options作為可選參數(shù);詳細請看官網(wǎng):express內(nèi)置中間件

以下示例將使用了 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,采用引入外部模塊的方式來獲得更多的應(yīng)用操作。如后期的cookie和session。

var express = require('express');

var app = express();

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

以上就是關(guān)于express中間件類型,在實際項目中,中間件都是必不可少的,因此熟悉使用各種中間件會加快項目的開發(fā)效率。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容