第5篇:EggJS中間件開發與實戰應用

在Web開發中,中間件(Middleware)是處理HTTP請求和響應的核心機制之一。EggJS基于Koa的洋蔥模型實現了高效的中間件機制,本文將深入探討中間件的執行原理、開發實踐以及常見問題解決方案。

在這里插入圖片描述

一、中間件執行機制與洋蔥模型

1. 洋蔥模型解析

EggJS繼承自Koa的洋蔥模型,中間件按照“先進后出”的順序執行,形成一個類似洋蔥的結構:

// 中間件執行順序示例
app.use(async (ctx, next) => {console.log('Middleware 1 Start');await next();console.log('Middleware 1 End');
});app.use(async (ctx, next) => {console.log('Middleware 2 Start');await next();console.log('Middleware 2 End');
});// 請求處理流程輸出:
// Middleware 1 Start → Middleware 2 Start → Controller → Middleware 2 End → Middleware 1 End

執行特點

  • 請求從外到內穿過各層中間件
  • 響應從內到外返回時執行剩余邏輯
  • 支持異步操作(async/await

二、開發常用中間件實戰

1. 日志記錄中間件

記錄請求基本信息與響應時間:

// app/middleware/access_log.js
module.exports = (options) => {return async (ctx, next) => {const start = Date.now();await next();const cost = Date.now() - start;ctx.logger.info(`${ctx.method} ${ctx.url} - ${ctx.status} [${cost}ms]`);};
};

2. 權限校驗中間件

JWT Token驗證示例:

// app/middleware/auth.js
const jwt = require('jsonwebtoken');module.exports = () => {return async (ctx, next) => {const token = ctx.get('Authorization');try {const decoded = jwt.verify(token, ctx.app.config.jwtSecret);ctx.state.user = decoded; // 用戶信息掛載到上下文await next();} catch (err) {ctx.status = 401;ctx.body = { message: 'Invalid token' };}};
};

3. 性能監控中間件

上報接口響應時間:

// app/middleware/performance.js
module.exports = () => {return async (ctx, next) => {const start = Date.now();await next();const cost = Date.now() - start;ctx.app.metrics.timing('http_request_duration', cost, {method: ctx.method,path: ctx.path,status: ctx.status});};
};

三、中間件配置策略

1. 全局中間件配置

config/config.default.js中啟用:

module.exports = {middleware: ['performance', 'accessLog'],// 中間件參數配置accessLog: {ignorePaths: ['/healthcheck']}
};

2. 路由級中間件配置

在路由文件中指定:

// app/router.js
module.exports = app => {const { router, middleware } = app;router.get('/admin',middleware.auth(), // 路由中間件controller.admin.index);
};

執行順序

  1. 全局中間件按配置數組順序執行
  2. 路由級中間件在匹配到路由后執行

四、常見開發陷阱與規避

1. 忘記調用next()

錯誤示例:

module.exports = () => {return async (ctx) => { // 缺少next參數// 業務邏輯...// 未執行await next()};
};

后果:請求被掛起,后續中間件不執行

2. 異步操作處理不當

正確做法:

module.exports = () => {return async (ctx, next) => {await someAsyncTask(); // 必須await異步操作await next();};
};

3. 中間件順序錯誤

黃金法則

  • 通用中間件(如日志)放在前面
  • 業務相關中間件(如權限)放在后面

4. 性能問題優化

避免在中間件中:

  • 同步阻塞操作(如大文件讀取)
  • 高頻的遠程調用(可改用緩存)

五、最佳實踐建議

  1. 職責單一:每個中間件只處理一個功能
  2. 合理分層
    • 全局層:日志、性能監控
    • 路由層:權限校驗、參數校驗
  3. 錯誤處理:使用try/catch包裹核心邏輯
  4. 性能監控:關鍵中間件添加耗時統計

總結

中間件機制是EggJS框架的核心特性之一,合理使用中間件可以實現以下優勢:

  • 功能解耦:分離業務與非業務邏輯
  • 邏輯復用:通用功能全局生效
  • 靈活擴展:按需組合不同中間件

下篇預告:數據庫操作與ORM實踐

下一篇將深入探討:

  • MySQL基礎配置與多環境適配
  • Sequelize模型定義與關聯關系
  • 復雜查詢構建與性能優化
  • 數據庫遷移與種子數據管理

正確理解和應用中間件,可以顯著提升EggJS應用的開發效率和可維護性。下一篇文章我們將深入探討《數據庫操作與ORM實踐》,解析如何在Egg中高效操作數據庫。歡迎在評論區留下你遇見的「中間件」設計經驗與挑戰,共同探討最佳實踐!

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

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

相關文章

樹狀結構轉換工具類

項目中使用了很多樹狀結構,為了方便使用開發一個通用的工具類。 使用工具類的時候寫一個類基礎BaseNode,如果有個性化字段添加到類里面,然后就可以套用工具類。 工具類會將id和pid做關聯返回一個樹狀結構的集合。 使用了hutool的工具包判空…

【Python】--裝飾器

裝飾器(Decorator)本質上是一個返回函數的函數 主要作用是:在不修改原函數代碼的前提下,給函數增加額外的功能 比如:增加業務,日志記錄、權限驗證、執行時間統計、緩存等場景 my_decorator def func():pas…

AI教你學VUE——Gemini版

前端開發學習路線圖 (針對編程新手,主攻 Vue 框架) 總原則:先夯實基礎,再深入框架。 想象一下建房子,地基不牢,上面的高樓(框架)是蓋不起來的。HTML、CSS、JavaScript 就是前端的地基。 階段一…

神經網絡中之多類別分類:從基礎到高級應用

神經網絡中之多類別分類:從基礎到高級應用 摘要 在機器學習領域,多類別分類是解決復雜問題的關鍵技術之一。本文深入探討了神經網絡在多類別分類中的應用,從基礎的二元分類擴展到一對多和一對一分類方法。我們詳細介紹了 softmax 函數的原理…

Go Web 后臺管理系統項目詳解

Go Web 后臺管理系統項目詳解 一、背景介紹 這是一個基于 Go 語言開發的 Web 后臺管理系統,為筆者學習期間練手之作,較為粗糙 二、技術架構 后端 語言 :采用 Go 語言(Golang)編寫,因其簡潔高效、并發能…

【Python系列】Python 中的 HTTP 請求處理

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

OS7.【Linux】基本指令入門(6)

目錄 1.zip和unzip 配置指令 使用 兩個名詞:打包和壓縮 打包 壓縮 Linux下的操作演示 壓縮和解壓縮文件 壓縮和解壓縮目錄 -d選項 2.tar Linux下的打包和壓縮方案簡介 czf選項 xzf選項 -C選項 tzf選項 3.bc 4.uname 不帶選項的uname -a選項 -r選項 -v選項…

windows系統 壓力測試技術

一、CPU壓測模擬 工具:CpuStres v2.0 官網:https://learn.microsoft.com/en-us/sysinternals/downloads/cpustres 功能:是一個工具類,用來模擬在一個進程中啟動最多64個線程,且可以獨立控制任何一個線程的啟動/暫停、…

64.搜索二維矩陣

給你一個滿足下述兩條屬性的 m x n 整數矩陣: 每行中的整數從左到右按非嚴格遞增順序排列。每行的第一個整數大于前一行的最后一個整數。 給你一個整數 target ,如果 target 在矩陣中,返回 true ;否則,返回 false 。 示…

在 PyTorch 中借助 GloVe 詞嵌入完成情感分析

一. Glove 詞嵌入原理 GloVe是一種學習詞嵌入的方法,它希望擬合給定上下文單詞i時單詞j出現的次數。使用的誤差函數為: 其中N是詞匯表大小,是線性層參數, 是詞嵌入。f(x)是權重項,用于平衡不同頻率的單詞對誤差的影響…

kotlin中 熱流 vs 冷流 的本質區別

🔥 冷流(Cold Flow) vs 熱流(Hot Flow)區別 特性冷流(Cold Flow)熱流(Hot Flow)數據生產時機每次 collect 才開始執行啟動時就開始生產、始終運行生命周期與 collect 者…

精益數據分析(44/126):深度解析媒體網站商業模式的關鍵要點

精益數據分析(44/126):深度解析媒體網站商業模式的關鍵要點 在創業與數據分析的探索道路上,我們不斷挖掘不同商業模式的核心要素,今天將深入剖析媒體網站商業模式。希望通過對《精益數據分析》相關內容的解讀&#xf…

Android學習總結之Java和kotlin區別

一、空安全機制 真題 1:Kotlin 如何解決 Java 的 NullPointerException?對比兩者在空安全上的設計差異 解析: 核心考點:Kotlin 可空類型系統(?)、安全操作符(?./?:)、非空斷言&…

[Survey]Remote Sensing Temporal Vision-Language Models: A Comprehensive Survey

BaseInfo TitleRemote Sensing Temporal Vision-Language Models: A Comprehensive SurveyAdresshttps://arxiv.org/abs/2412.02573Journal/Time2024 arxivAuthor北航 上海AI LabCodehttps://github.com/Chen-Yang-Liu/Awesome-RS-Temporal-VLM 1. Introduction 傳統遙感局限…

jmeter讀取CSV文件中文亂碼的解決方案

原因分析? CSV文件出現中文亂碼通常是因為文件編碼與JMeter讀取編碼不一致。常見場景: 文件保存為GBK/GB2312編碼,但JMeter以UTF-8讀取。文件包含BOM頭(如Windows記事本保存的UTF-8),但JMeter未正確處理。腳本讀取文…

Webview通信系統學習指南

Webview通信系統學習指南 一、定義與核心概念 1. 什么是Webview? 定義:Webview是移動端(Android/iOS)內置的輕量級瀏覽器組件,用于在原生應用中嵌入網頁內容。作用:實現H5頁面與原生應用的深度交互&…

【C++】C++中的命名/名字/名稱空間 namespace

C中的命名/名字/名稱空間 namespace 1、問題引入2、概念3、作用4、格式5、使用命名空間中的成員5.1 using編譯指令( 引進整個命名空間) ---將這個盒子全部打開5.2 using聲明使特定的標識符可用(引進命名空間的某個成員) ---將這個盒子中某個成員的位置打…

Arduino IDE中離線更新esp32 3.2.0版本的辦法

在Arduino IDE中更新esp32-3.2.0版本是個不可能的任務,下載文件速度極慢。網上提供了離線的辦法,提供了安裝文件,但是沒有3.2.0的版本。 下面提供了一種離線安裝方法 一、騰訊元寶查詢解決辦法 通過打開開發板管理地址:通過在騰…

【工具使用-數據可視化工具】Apache Superset

1. 工具介紹 1.1. 簡介 一個輕量級、高性能的數據可視化工具 官網:https://superset.apache.org/GitHub鏈接:https://github.com/apache/superset官方文檔:https://superset.apache.ac.cn/docs/intro/ 1.2. 核心功能 豐富的可視化庫&…

算法每日一題 | 入門-順序結構-三角形面積

三角形面積 題目描述 一個三角形的三邊長分別是 a、b、c,那么它的面積為 p ( p ? a ) ( p ? b ) ( p ? c ) \sqrt{p(p-a)(p-b)(p-c)} p(p?a)(p?b)(p?c) ?,其中 p 1 2 ( a b c ) p\frac{1}{2}(abc) p21?(abc) 。輸入這三個數字,…