溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Express中間件的使用、原理及實(shí)現(xiàn)方法

發(fā)布時(shí)間:2021-07-16 10:32:03 來源:億速云 閱讀:334 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“Express中間件的使用、原理及實(shí)現(xiàn)方法”,在日常操作中,相信很多人在Express中間件的使用、原理及實(shí)現(xiàn)方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”Express中間件的使用、原理及實(shí)現(xiàn)方法”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

現(xiàn)在在一些企業(yè)里用nodejs做服務(wù)端開發(fā)已經(jīng)很普遍了,這里面最火的框架當(dāng)然要數(shù)express了,express將nodejs原生的支持的http模塊進(jìn)行了簡單封裝,使開發(fā)者使用起來得心應(yīng)手。

這其中最方便的便是express的中間件機(jī)制了。在介紹express的中間件的原理和實(shí)現(xiàn)之前咱們先看一下express中間件如何使用。

express的中間件機(jī)制類似一個(gè)漏斗裝置,一個(gè)請求到達(dá)服務(wù)端后,這個(gè)請求會(huì)被抽象成一個(gè)req對(duì)象,這個(gè)對(duì)象會(huì)一次進(jìn)入中間件,在中間件中分別被處理,最后被路由處理函數(shù)分發(fā)。

如圖:

Express中間件的使用、原理及實(shí)現(xiàn)方法

代碼演示如圖:

Express中間件的使用、原理及實(shí)現(xiàn)方法

之后啟動(dòng)這個(gè)express服務(wù),不論訪問根路徑 "/"還是"/a",中間件都會(huì)被執(zhí)行,這說明每次請求這個(gè)服務(wù),中間件都會(huì)被逐一執(zhí)行。

那這樣做的目的是什么呢?咱們來實(shí)現(xiàn)一個(gè)需求,需要計(jì)算整個(gè)網(wǎng)站的pv,也就是整個(gè)網(wǎng)站被客戶端請求了多殺次,如果不用中間件會(huì)如何做呢?看代碼:

Express中間件的使用、原理及實(shí)現(xiàn)方法

如果使用了中間件呢?再看如下代碼:

Express中間件的使用、原理及實(shí)現(xiàn)方法

仔細(xì)看一下這兩份代碼的區(qū)別,第二份明顯簡潔了好多,將計(jì)算訪問量的代碼放到中間件中,不需要再在各個(gè)路由中分寫再去寫了,提高了復(fù)用性,邏輯表達(dá)更清晰,易于維護(hù),以上便是express中間件的使用了,這里需要注意的是,中間件的調(diào)用順序是從上到下,每個(gè)中間件調(diào)用完成后必須調(diào)用next。

那么中間件機(jī)制的原理是什么呢,是如何實(shí)現(xiàn)的呢?

看下面一段代碼:

var http = require('http');

function express() {

   var funcs = []; // 待執(zhí)行的函數(shù)數(shù)組

   var app = function (req, res) {
       var i = 0;

       function next() {
           var task = funcs[i++];  // 取出函數(shù)數(shù)組里的下一個(gè)函數(shù)
           if (!task) {    // 如果函數(shù)不存在,return
               return;
           }
           task(req, res, next);   // 否則,執(zhí)行下一個(gè)函數(shù)
       }

       next();
   }

   app.use = function (task) {
       funcs.push(task);
   }

   return app;    // 返回實(shí)例
}

var app = express();

function middlewareA(req, res, next) {
   console.log('中間件1');
   next();
}

function middlewareB(req, res, next) {
   console.log('中間件2');
   next();
}

function middlewareC(req, res, next) {
   console.log('中間件3');
   next();
}
app.use(middlewareA);
app.use(middlewareB);
app.use(middlewareC);

http.createServer(app).listen('3000', function () {
   console.log('listening 3000....');
});

以上代碼便是express實(shí)現(xiàn)中間件機(jī)制的核心代碼。

簡單來說,有如下幾點(diǎn):

  1. express函數(shù)調(diào)用返回一個(gè)app實(shí)例

  2. 在express函數(shù)內(nèi)部定義一個(gè)數(shù)組來存儲(chǔ)中間件函數(shù)

  3. 在express函數(shù)內(nèi)部定義一個(gè)app函數(shù)

  4. 在app函數(shù)的內(nèi)部定義一個(gè)變量i保存執(zhí)行的中間件的位置。

  5. 在app函數(shù)中定義一個(gè)next方法,這個(gè)方法通過i值自增調(diào)用中間件

  6. 在app函數(shù)內(nèi)部調(diào)用next

  7. 在app函數(shù)上定義一個(gè)use方法,這個(gè)方法可以將中間件函數(shù)push進(jìn)中間件數(shù)組中。

這樣的話,express中間件的調(diào)用過程其實(shí)就是一個(gè)非常多的函數(shù)嵌套,形似如下代碼:

Express中間件的使用、原理及實(shí)現(xiàn)方法

中間件越多嵌套的層級(jí)越多。

到此,關(guān)于“Express中間件的使用、原理及實(shí)現(xiàn)方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI