NodeJS的中間件是什么

說簡單一點,中間件就是在你的請求和業務邏輯之間做一層攔截。

Node.js 中,中間件(Middleware) 是一種函數,它在 請求(Request)到達路由處理器之前,或在 響應(Response)發出之前,對請求進行處理。


🧠 一句話理解:

中間件就是“請求-響應”過程中的 攔截器、處理器或過濾器,可以對請求做日志、驗證、解析、權限、響應包裝等操作。


? 主要特征

在常見的 Node.js Web 框架(如 Express、Koa)中,中間件具有以下特點:

  • 本質是一個函數

  • 接收 (req, res, next) 這三個參數(Express)

  • 可以決定是否繼續交給下一個中間件(調用 next()


📦 Express 中間件示例

示例:記錄請求日志的中間件

const express = require('express');
const app = express();// 中間件函數
function logger(req, res, next) {console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);next(); // 繼續交給下一個中間件
}app.use(logger); // 應用中間件app.get('/', (req, res) => {res.send('Hello, Middleware!');
});app.listen(3000, () => console.log('Server started'));

🚀 中間件的分類

類型說明
應用級中間件使用 app.use()app.METHOD() 注冊
路由級中間件只在特定路由生效
錯誤處理中間件帶有 4 個參數 (err, req, res, next)
內置中間件express.json()express.static()
第三方中間件body-parsercorshelmet


🧩 示例:多個中間件串聯

app.use((req, res, next) => {console.log('中間件 A');next();
});app.use((req, res, next) => {console.log('中間件 B');next();
});app.get('/', (req, res) => {console.log('路由處理器');res.send('OK');
});

訪問 / 頁面,輸出:

中間件 A
中間件 B
路由處理器

🔄 Koa 中的中間件機制(異步、洋蔥模型)

Koa 中間件是 async 函數,支持“前進+回退”的洋蔥模型執行機制

const Koa = require('koa');
const app = new Koa();app.use(async (ctx, next) => {console.log('1. Start');await next(); // 進入下一層console.log('1. End');
});app.use(async (ctx, next) => {console.log('2. Start');await next();console.log('2. End');
});app.use(async ctx => {console.log('3. Handler');ctx.body = 'Hello from Koa';
});app.listen(3000);

輸出順序是:

1. Start
2. Start
3. Handler
2. End
1. End

📌 中間件的用途舉例

目的示例
請求日志記錄morgan, 自定義 logger 中間件
權限認證判斷用戶 token 是否有效
解析請求體body-parser, express.json()
設置響應頭跨域 CORS 控制
捕獲異常錯誤處理中間件
靜態資源托管express.static('public')


🧠 總結一句話:

中間件是構成 Node.js Web 框架(如 Express/Koa)核心機制之一,它將請求處理拆分為多個函數鏈式執行,使得邏輯清晰、易于復用和維護。


如果你想自己寫一個中間件系統(類 Express),我可以提供底層實現原理代碼。是否需要?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84217.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84217.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84217.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MCAL學習(6)——診斷、DCM

1.診斷概述 汽車診斷就是通過汽車總線(CAN LIN Eth)來進行診斷會話,大部分通過CAN總線通訊進行請求與響應。 1.診斷分層 DCM內部支持UDS服務和OBD服務(排放,動力)。 以統一診斷服務UDS為例,應…

kafka-生產者-(day-4)

day-3 BufferPool 產生原因:ByteBuffer的創建和釋放都是比較耗費資源的,為了實現內存的高效利用,產生了他。他會對特定大小的ByteBuffer進行管理 BufferPool的字段 free:是一個ArrayDeque隊列,緩存指定大小的ByteBuffer對象Re…

java 驗證ip是否可達

默認IP的設備已開放ping功能 代碼 public class PingTest {public static void main(String[] args) throws Exception {String ip "192.168.21.101";boolean reachable InetAddress.getByName(ip).isReachable(3000);System.out.println(ip (reachable ? &quo…

LeetCode 2187.完成旅途的最少時間

題目: 給你一個數組 time ,其中 time[i] 表示第 i 輛公交車完成 一趟旅途 所需要花費的時間。 每輛公交車可以 連續 完成多趟旅途,也就是說,一輛公交車當前旅途完成后,可以 立馬開始 下一趟旅途。每輛公交車 獨立 運…

永磁同步電機無速度算法--基于正切函數鎖相環的滑模觀測器

最近在學習鎖相環,后續會記錄一下了解到的幾種PLL。 一、原理介紹 傳統鎖相環控制框圖如下所示 在電機正轉時,傳統鎖相環可以實現很好的轉速和轉子位置估計,但是當電機反轉,反電動勢符號發生變化,系統估計轉子位置最…

Vim-vimrc 快捷鍵映射

Vim-vimrc 快捷鍵映射 文章目錄 Vim-vimrc 快捷鍵映射Leader 鍵快捷鍵映射:插入特定字符插入 --插入 ##插入 解釋Leader鍵設置快速插入分隔線 Leader 鍵 我們還將 , 設置為 Leader 鍵,使得其他快捷鍵映射更加簡潔。 let mapleader ","快捷鍵…

SylixOS armv7 任務切換

SylixOS 操作系統下,任務切換可以分為兩種 中斷退出時,執行的任務切換(_ScheduleInt)內核退出時,執行的任務切換(_Schedule) 下面分別講講這兩種任務切換 1、中斷退出時任務切換 關于 ARM 架…

Java 自定義異常:如何優雅地處理程序中的“業務病”?

🔥「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 一、從一個真實場景開始:銀行轉賬系統的困境 假設你正在開發一個銀行轉賬系統,當用戶嘗試轉賬時可能出現以下問題: 轉…

【JAVA】【Stream流】

1. filter操作 filter()方法用于根據給定的條件過濾列表中的元素&#xff0c;僅保留滿足條件的項。 List<Integer> list Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);List<Integer> res list.stream().filter(a -> a % 2 0).collect(Collectors.toList());for(I…

四、Redis實現限流

簡介&#xff1a; 限流算法在分布式領域是一個經常被提起的話題&#xff0c;當系統的處理能力有限時&#xff0c;如何阻止計劃外的請求繼續對系統施壓。 系統要限定用戶的某個行為在指定的時間里只能允許發生 N 次&#xff0c;如何使用 Redis 的數據結構來實現這個限流的功能&a…

基于Geotools的兩條道路相交并根據交點形成新路線實戰-以OSM數據為例

目錄 前言 一、需求場景及分解 1、需求場景 2、需求應用 二、需求實現 1、加載路網數據 2、獲取道路信息 3、相交點求解 4、生成新道路 5、結果可視化 三、總結 前言 在當今數字化迅速發展的時代&#xff0c;地理空間數據的處理與分析已成為眾多領域不可或缺的關鍵技…

goland有基礎速通(需要其它編程語言基礎)

tip: 無論是變量、方法還是struct的訪問權限控制都是通過命名控制的&#xff0c;命名的首字母是大寫就相當于java中的public&#xff0c;小寫的話就是private&#xff0c;&#xff08;private只有本包可以訪問&#xff09; 1 go的變量聲明 普通變量 特點&#xff1a; 變量類…

量化面試綠皮書:19. 相關系數

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 19. 相關系數 假設有三個隨機變量x、y和z。 x與y之間的相關系數為0.8&#xff0c;x與z之間的相關系數也是0.8。 Q: 那么y與z之間的最大相關…

新生活的開啟:從 Trae AI 離開后的三個月

很久沒有寫文章了&#xff0c;想借著入職新公司一個月的機會&#xff0c;和大家嘮嘮嗑。 離職 今年2月份我從字節離職了&#xff0c;結束了四年的經歷&#xff0c;當時離開的核心原因是覺得加班時間太長了&#xff0c;平均每天都要工作15&#xff0c;16個小時&#xff0c;周末…

LLM部署之vllm vs deepspeed

部署大語言模型(如 Qwen/LLaMA 等)時,vLLM 與 DeepSpeed 是當前主流的兩種高性能推理引擎。它們各自專注于不同方向,部署流程也有明顯區別。 vLLM 提供極致吞吐、低延遲的推理服務,適用于在線部署;DeepSpeed 更側重訓練與推理混合優化,支持模型并行,適用于推理 + 微調/…

Git(二):基本操作

文章目錄 Git(二)&#xff1a;基本操作添加文件修改文件版本回退撤銷修改情況一&#xff1a;工作區的代碼還沒有 add情況?&#xff1a;已經 add 但沒有 commit情況三&#xff1a;已經 add 并且也 commit 刪除文件 Git(二)&#xff1a;基本操作 添加文件 首先我們先來學習一個…

nginx + ffmpeg 實現 rtsp視頻實時播放和歷史播放

nginx和ffmpeg 的安裝請參考我的另一篇文章 Nginxrtmpffmpeg搭建視頻轉碼服務_nginx-rtmp-module-master-CSDN博客 目錄 1、整體方案設計如圖 2、nginx下目錄創建和配置文件創建 3、創建視頻流生成腳本 4、修改nginx配置 5、管理界面 (video.html) 6、ffmpeg后臺啟動 …

全國產!瑞芯微 RK3576 ARM 八核 2.2GHz 工業核心板—硬件說明書

前 言 本文為創龍科技 SOM-TL3576 工業核心板硬件說明書,主要提供 SOM-TL3576 工業 核心板的產品功能特點、技術參數、引腳定義等內容,以及為用戶提供相關電路設計指導。 為便于閱讀,下表對文檔出現的部分術語進行解釋;對于廣泛認同釋義的術語,在此不做注釋。 硬件參考…

web3 瀏覽器注入 (如 MetaMask)

以下是關于 瀏覽器注入方式(如 MetaMask) 的完整詳解,包括原理、使用方法、安全注意事項及常見問題解決方案: 1. 核心原理 當用戶安裝 MetaMask 等以太坊錢包擴展時,錢包會向瀏覽器的 window 對象注入一個全局變量 window.ethereum,這個對象遵循 EIP-1193 標準,提供與區…

解密提示詞工程師:AI 時代的新興職業

大家好!在人工智能飛速發展的當下&#xff0c;有一個新興職業正悄然崛起——提示詞工程師。他們雖不如數據科學家般廣為人知&#xff0c;卻在 AI 應用領域發揮著獨特且關鍵的作用。 何為提示詞工程師&#xff1f; 提示詞工程師專注于設計和優化與 AI 模型進行交互的提示詞&…