您好,登錄后才能下訂單哦!
這篇文章主要介紹“Express中間件的使用、原理及實現方法”,在日常操作中,相信很多人在Express中間件的使用、原理及實現方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Express中間件的使用、原理及實現方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
現在在一些企業里用nodejs做服務端開發已經很普遍了,這里面最火的框架當然要數express了,express將nodejs原生的支持的http模塊進行了簡單封裝,使開發者使用起來得心應手。
這其中最方便的便是express的中間件機制了。在介紹express的中間件的原理和實現之前咱們先看一下express中間件如何使用。
express的中間件機制類似一個漏斗裝置,一個請求到達服務端后,這個請求會被抽象成一個req對象,這個對象會一次進入中間件,在中間件中分別被處理,最后被路由處理函數分發。
如圖:
代碼演示如圖:
之后啟動這個express服務,不論訪問根路徑 "/"還是"/a",中間件都會被執行,這說明每次請求這個服務,中間件都會被逐一執行。
那這樣做的目的是什么呢?咱們來實現一個需求,需要計算整個網站的pv,也就是整個網站被客戶端請求了多殺次,如果不用中間件會如何做呢?看代碼:
如果使用了中間件呢?再看如下代碼:
仔細看一下這兩份代碼的區別,第二份明顯簡潔了好多,將計算訪問量的代碼放到中間件中,不需要再在各個路由中分寫再去寫了,提高了復用性,邏輯表達更清晰,易于維護,以上便是express中間件的使用了,這里需要注意的是,中間件的調用順序是從上到下,每個中間件調用完成后必須調用next。
那么中間件機制的原理是什么呢,是如何實現的呢?
看下面一段代碼:
var http = require('http');
function express() {
var funcs = []; // 待執行的函數數組
var app = function (req, res) {
var i = 0;
function next() {
var task = funcs[i++]; // 取出函數數組里的下一個函數
if (!task) { // 如果函數不存在,return
return;
}
task(req, res, next); // 否則,執行下一個函數
}
next();
}
app.use = function (task) {
funcs.push(task);
}
return app; // 返回實例
}
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實現中間件機制的核心代碼。
簡單來說,有如下幾點:
express函數調用返回一個app實例
在express函數內部定義一個數組來存儲中間件函數
在express函數內部定義一個app函數
在app函數的內部定義一個變量i保存執行的中間件的位置。
在app函數中定義一個next方法,這個方法通過i值自增調用中間件
在app函數內部調用next
在app函數上定義一個use方法,這個方法可以將中間件函數push進中間件數組中。
這樣的話,express中間件的調用過程其實就是一個非常多的函數嵌套,形似如下代碼:
中間件越多嵌套的層級越多。
到此,關于“Express中間件的使用、原理及實現方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。