nodejs?express實現(xiàn)中間件
更新時間:2022年10月14日 10:42:21 作者:南方小菜
這篇文章主要為大家介紹了nodejs?express實現(xiàn)中間件實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
先看應(yīng)用
應(yīng)用規(guī)則:
- express 中 use 的第一個參數(shù)是匹配路徑 不傳相當于"/"
- 中間件匹配機制是惰性匹配,即匹配路徑為
/a的中間件,訪問/aa時同樣會被執(zhí)行(這也意味著不傳匹配路徑時即所有請求都會應(yīng)用此中間件)
const express = require("./express");
const app = express();
// 第一個參數(shù)是匹配路徑 不傳相當于"/"
app.use(function (req, res, next) {
req.a = 1;
next();
});
app.use("/", function (req, res, next) {
req.a++;
next();
});
app.get("/", function (req, res, next) {
res.end(req.a + "");
});
app.use("/a", function (req, res, next) {
req.a++;
next();
});
app.get("/a", function (req, res, next) {
res.end(req.a + "");
});
app.listen(3000);

實現(xiàn)思路
結(jié)合之前的路由實現(xiàn),其實中間件就是【沒有路由表】的 Layer,我們只需要
- 訂閱監(jiān)聽時做下對“不傳匹配路徑”等情況的處理
- 請求發(fā)布時根據(jù)“是否具有路由表
route屬性”進行判斷從而對中間件區(qū)分處理
如此即可
具體實現(xiàn)
訂閱監(jiān)聽時做下對“不傳匹配路徑”等情況的處理
定義use方法
Router.prototype.use = function (path, ...handlers) {
if (!handlers[0]) {
// 只傳遞了一個函數(shù)
handlers.push(path); // app.use(function(){}) app.use()
path = "/";
}
handlers.forEach((handler) => {
let layer = new Layer(path, handler);
layer.route = undefined; // 不寫也是 undefined , 主要告訴你 中間件沒有 route
this.stack.push(layer);
});
};
請求發(fā)布時根據(jù)“是否具有路由表route屬性”進行判斷從而對中間件區(qū)分處理
改寫handle方法
Router.prototype.handle = function (req, res, done) {
let { pathname } = url.parse(req.url);
let method = req.method.toLowerCase();
let idx = 0;
const next = (err) => {
// 中間件 和內(nèi)部的 next 方法 出錯都會走這個 next
if (idx >= this.stack.length) return done(); // 路由處理不了 傳遞給應(yīng)用層
let layer = this.stack[idx++];
// 無論是路由還是中間件 前提是路徑必須匹配
if (layer.match(pathname)) {
// match 還沒有更改
if (!layer.route) {
// 沒有說明是中間件 注意 此處就是對中間件的區(qū)分處理
layer.handle_request(req, res, next); // 直接執(zhí)行中間件函數(shù)
} else {
// 路由必須匹配方法
if (layer.route.methods[method]) {
// 這個 next 可以讓路由層掃描下一個 layer
layer.handle_request(req, res, next); // route.dispatch
} else {
next();
}
}
} else {
next();
}
};
next(); // 請求來了取出第一個執(zhí)行
};
總結(jié)流程

以上就是nodejs express實現(xiàn)中間件的詳細內(nèi)容,更多關(guān)于nodejs express中間件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于node使用multer進行文件的上傳與下載
這篇文章主要介紹了關(guān)于node使用multer進行文件的上傳與下載,Multer是一個Node.js中間件,用于處理表單數(shù)據(jù)中的multipart/form-data類型,需要的朋友可以參考下2023-04-04
node.js中實現(xiàn)kindEditor圖片上傳功能的方法教程
最近在做一個類似于論壇的系統(tǒng),帖子需要進行圖文并茂的顯示,所以用到了富文本編輯器:kindeditor,下面這篇文章主要給大家介紹了在node.js中實現(xiàn)kindEditor圖片上傳功能的方法教程,需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04
electron demo項目npm install安裝失敗的解決方法
下面小編就為大家分享一篇electron demo項目npm install安裝失敗的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
深入理解nodejs搭建靜態(tài)服務(wù)器(實現(xiàn)命令行)
這篇文章主要介紹了深入理解nodejs搭建靜態(tài)服務(wù)器(實現(xiàn)命令行),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
Node.js中的npm單獨與批量升級依賴包的方式超詳細講解
npm outdated僅檢查所有已安裝包的依賴關(guān)系,并將當前版本遠程倉庫中的最新版本進行對比,不會升級,這篇文章主要介紹了Node.js中的npm單獨與批量升級依賴包的方式超詳細講解,需要的朋友可以參考下2024-02-02

