【express-generator】05-路由中間件和錯誤處理(第一階段收尾)

一、前言

上篇文章我們介紹了express-generator的請求體解析,重點講了常用的請求體數據格式(JSON/URL 編碼的表單數據)以及一個FILE文件上傳,同時搭配代碼示范進行輔助理解。

二、本篇重點

我們繼續第一階段的知識,本篇把最后兩個知識點(路由中間件和錯誤請求)講完,順利完成第一階段的初步認識和學習。

三、知識點:路由中間件

1、路由中間件是什么?

路由中間件是 Express 中的一個強大功能,它允許你在處理請求之前和之后執行自定義邏輯。中間件可以用于各種任務,如日志記錄、身份驗證、數據驗證等。?

?路由中間件可以被理解為一個函數,它接收三個參數:req(請求對象)、res(響應對象)和 next(函數)。這個函數可以對這三個參數進行操作,并且通過這些操作來影響 Express 服務器的行為。以下是路由中間件的一些關鍵點:

  1. 接收參數

    • req(請求對象):包含了請求的所有信息,如請求方法、URL、請求頭、請求體等。中間件可以讀取和修改?req?對象的屬性。
    • res(響應對象):用于向客戶端發送響應。中間件可以發送響應、設置響應頭、設置響應狀態碼等。
    • next(函數):調用?next()?可以將控制權傳遞給下一個中間件或路由處理函數。如果不調用?next(),請求處理流程將停止。
  2. 操作和影響

    • 讀取和修改請求信息:中間件可以讀取請求中的數據,如解析請求體、獲取請求頭信息等。也可以修改請求對象,如添加自定義屬性、修改請求參數等。
    • 發送響應:中間件可以直接向客戶端發送響應,結束請求處理流程。例如,可以發送錯誤響應、重定向響應等。
    • 執行自定義邏輯:中間件可以執行各種自定義邏輯,如身份驗證、日志記錄、數據驗證、緩存處理等。
    • 錯誤處理:中間件可以捕獲和處理錯誤,將錯誤傳遞給錯誤處理中間件,或者直接發送錯誤響應。

?中間件的執行順序

  • 順序執行:中間件按照它們在?app.use()?中被調用的順序執行。每個中間件都有機會處理請求,并決定是否將控制權傳遞給下一個中間件。
  • 調用?next():中間件通過調用?next()?函數來將控制權傳遞給下一個中間件。如果中間件不調用?next(),請求處理流程將停止,不會執行后續的中間件或路由處理函數。

2、express-generator創建express應用程序,默認使用的路由中間件

?首先讓我們看看使用express-generator創建一個express應用程序時,app.js默認使用的路由中間件有哪些

知識點相關介紹:?

1.?logger('dev')

  • 作用:使用?morgan?日志記錄器中間件,記錄 HTTP 請求的詳細信息。
  • 配置'dev'?是?morgan?的預定義格式之一,它會在開發環境中提供簡潔的彩色日志輸出,包括請求方法、URL、響應狀態碼和響應時間等。
  • 使用場景:用于開發環境中的日志記錄,幫助開發者監控和調試應用程序。

2.?express.json()

  • 作用:解析 JSON 格式的請求體。
  • 使用場景:用于處理客戶端發送的 JSON 數據,例如 API 請求中的 JSON 數據。

3.?express.urlencoded({ extended: false })

  • 作用:解析 URL 編碼的請求體。
  • 配置{ extended: false }?表示使用內置的查詢字符串解析器,它只能解析簡單的鍵值對,不支持嵌套對象或數組。
  • 使用場景:用于處理 HTML 表單提交的數據,這些數據通常以?application/x-www-form-urlencoded?格式發送。

4.?cookieParser()

  • 作用:解析客戶端發送的 Cookie。
  • 使用場景:用于處理客戶端發送的 Cookie,以便在服務器端進行身份驗證或其他需要 Cookie 的操作。

5.?express.static(path.join(__dirname, 'public'))

  • 作用:提供靜態文件服務。
  • 配置path.join(__dirname, 'public')?指定了靜態文件的目錄,通常是項目的?public?目錄。
  • 使用場景:用于提供網站的靜態資源,如圖片、CSS、JavaScript 文件等,使得客戶端可以直接訪問這些文件。

?3、動手寫一個簡單的路由中間件

const express = require('express');
const app = express();// 定義一個日志記錄中間件
function logRequest(req, res, next) {const { method, url } = req;console.log(`Received ${method} request for ${url}`);next(); // 調用下一個中間件 
}// 使用中間件
app.use(express.json())  //解析請求體數據
app.use(logRequest);     //日志記錄中間件
app.get('/', (req, res) => {res.send('Hello, World!');
});
app.post('/user', (req, res) => {console.log("接收的請求體參數>>>",req.body);res.send(req.body);});app.listen(3009, () => {console.log('Server is running on port 3009');
});

?啟動服務器,打開apipost工具進行路由測試

?在這個示例中,logRequest 中間件會在每個請求到達時記錄請求方法和 URL。

四、知識點:錯誤處理

錯誤處理是任何 Web 應用程序的重要組成部分。在 Express 中,錯誤處理中間件用于捕獲和處理在請求處理過程中發生的錯誤。

常用知識點

  • 錯誤處理中間件:必須有四個參數:errreqres?和?next
  • 拋出錯誤:在中間件或路由處理函數中使用?next(err)?來傳遞錯誤。
  • 自定義錯誤對象:可以創建自定義錯誤對象以提供更詳細的錯誤信息。

?1、常見的錯誤類型

  1. 語法錯誤:由于代碼編寫錯誤導致的錯誤,如拼寫錯誤、語法不正確等。
  2. 運行時錯誤:在代碼執行過程中發生的錯誤,如訪問未定義的變量、調用不存在的方法等。
  3. HTTP 錯誤:與 HTTP 請求和響應相關的錯誤,如 404(未找到)、500(服務器內部錯誤)等。
  4. 輸入驗證錯誤:由于用戶輸入不符合預期格式或規則導致的錯誤。
  5. 數據庫錯誤:與數據庫操作相關的錯誤,如查詢失敗、連接錯誤等。

2、錯誤處理中間件

錯誤處理中間件是 Express 中用于處理錯誤的特殊中間件。它有四個參數:errreqresnext。當在中間件或路由處理函數中調用 next(err) 時,控制權會傳遞給錯誤處理中間件。

?一個簡單的代碼示范

const express = require('express');
const app = express();// 模擬一個路由處理函數,可能會拋出錯誤
app.get('/error', (req, res, next) => {const error = new Error('Something went wrong!');error.status = 500; // 設置 HTTP 狀態碼next(error); // 將錯誤傳遞給錯誤處理中間件
});// 錯誤處理中間件
app.use((err, req, res, next) => {console.error(err.stack); // 記錄錯誤堆棧res.status(err.status || 500).json({error: {message: err.message}});
});app.listen(3009, () => {console.log('Server is running on port 3009');
});

?啟動服務器,在apipost工具中進行測試。

點擊發送,得到結果

3、自定義錯誤對象

自定義錯誤對象可以幫助我們更清晰地表示特定類型的錯誤,并提供額外的上下文信息。

以下是一個自定義錯誤對象的簡單代碼示范。

const express = require('express');
const app = express();// 自定義錯誤類
class CustomError extends Error {constructor(message, status) {super(message);this.status = status;this.name = 'CustomError';}
}// 模擬路由 1:拋出自定義錯誤
app.get('/custom-error', (req, res, next) => {const error = new CustomError('Custom error occurred', 400);next(error);
});// 模擬路由 2:拋出普通錯誤
app.get('/error', (req, res, next) => {const error = new Error('Something went wrong!');error.status = 500;next(error);
});// 錯誤處理中間件
app.use((err, req, res, next) => {console.error(err.stack);res.status(err.status || 500).json({error: {message: err.message,name: err.name}});
});app.listen(3009, () => {console.log('Server is running on port 3009');
});

啟動服務,打開apipost攻擊進行測試

?


五、總結

至此,我們初步完成第一階段的所有知識學習以及練習。多動手實踐,舉一反三,希望文章的案例會對大家有所幫助。

接下來的文章,我們接著第二階段的知識學習以及代碼案例練習。第二階段的大綱如下:

第二階段:進階與應用

  1. RESTful API 設計

    • 學習如何設計符合 REST 原則的 API,包括資源的表示和 HTTP 方法的使用。

  2. 路由分組

    • 學習如何使用路由分組來組織相關的路由,提高代碼的可維護性。

  3. 路由重定向

    • 學習如何使用?res.redirect()?和?res.location()?來實現路由重定向。

  4. CRUD 操作

    • 練習實現完整的 CRUD 操作的路由,包括與數據庫的交互。?


如果你喜歡這篇文章,請點贊收藏。

關注我,獲取前端更多使用知識。

最近業務需求多,會比較忙,但我也會抽出時間進行更新文章,敬請期待。

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

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

相關文章

Vue3(elementPlus) el-table替換/隱藏行箭頭,點擊整行展開

element文檔鏈接: https://element-plus.org/zh-CN/component/form.html 一、el-table表格行展開關閉箭頭替換成加減號 注:Vue3在樣式中修改箭頭圖標無效,可能我設置不對,歡迎各位來交流指導 轉變思路:隱藏箭頭&…

【Javascript Day1】javascript基礎

javascript編程規則 彈窗&#xff08;舉例&#xff09; alert("內容")&#xff0c;直接寫在控制區生效 三種寫法 1、行內js語法 &#xff1a;需要注意引號的問題 <input type"button" value"提示窗" οnclick alert("消息") &…

GitLab創建用戶,設置訪問SSH Key

繼上一篇 Linux Red Hat 7.9 Server安裝GitLab-CSDN博客 安裝好gitlab&#xff0c;啟用管理員root賬號后&#xff0c;開始創建用戶賬戶 1、創建用戶賬戶 進入管理后臺頁面 點擊 New User 輸入用戶名、郵箱等必填信息和登錄密碼 密碼最小的8位&#xff0c;不然會不通過 拉到…

QT鼠標、鍵盤事件

一、鼠標 鼠標點擊 mousePressEvent 鼠標釋放 mouseReleaseEvent 鼠標移動 mouseMoveEvent 鼠標雙擊 mouseDoubleClickEvent 鼠標滾輪 QWheelEvent 二、鍵盤 鍵盤按下 keyPressEvent 鍵盤松開keyReleaseEvent 一、鼠標 #include <QMouseEvent> 鼠標點擊 mouse…

數據庫環境安裝(day1)

網址&#xff1a;MySQL 下載&#xff08;環境準備&#xff09;&#xff1a; &#xff08;2-5點擊此處&#xff0c;然后選擇合適的版本&#xff09; 1.linux在線YUM倉庫 下載/安裝: wget https://repo.mysql.com//mysql84-community-release-el9-1.noarch.rpm rpm -i https://r…

Qt 5.14.2 學習記錄 —— ? QWidget 常用控件(2)

文章目錄 1、Window Frame2、windowTitle3、windowIcon4、qrc機制5、windowOpacity 1、Window Frame 在運行Qt程序后&#xff0c;除了用戶做的界面&#xff0c;最上面還有一個框&#xff0c;這就是window frame框。對于界面的元素&#xff0c;它們的原點是Qt界面的左上角或win…

以太網協議在汽車應用中的動與靜

為了讓網絡中的設備能夠隨時或隨地接入網絡或離開網絡&#xff0c;做到&#xff1a;接入時無需多余的配置就能和其他設備互相通信&#xff1b;離開時又不會導致設備或網絡崩潰。以太網從物理層到協議層展現出多方面的靈活性&#xff0c;&#xff0c;使其成為連接各種設備和系統…

牛客網刷題 ——C語言初階(6指針)——BC105 矩陣相等判定

1. 題目描述&#xff1a;BC105 矩陣相等判定 牛客網OJ題鏈接 描述&#xff1a; KiKi得到了兩個n行m列的矩陣&#xff0c;他想知道兩個矩陣是否相等&#xff0c;請你回答他。(當兩個矩陣對應數組元素都相等時兩個矩陣相等)。 示例1 輸入&#xff1a; 2 2 1 2 3 4 1 2 3 4 輸出…

外觀設計模式學習

1.介紹 外觀模式&#xff08;Facade Pattern&#xff09; 是一種結構型設計模式&#xff0c;通過提供一個統一的接口&#xff0c;用于訪問子系統中的一組接口&#xff0c;從而簡化客戶端與復雜系統之間的交互。它隱藏了系統的復雜性&#xff0c;使得客戶端只需與一個簡單的接口…

基于單片機的數字氣壓計設計

摘要:在嵌入式技術快速發展過程中&#xff0c;智能測量儀器被廣泛應用于工業生產以及人們日常生活領域。數字氣壓計在實際應用中&#xff0c;利用氣壓傳感器檢測環境中的壓力大小&#xff0c;便于實現對設備進行智能化的控制操作。數字氣壓計在氣象監測、礦產開采、科學實驗等環…

嵌入式軟件C語言面試常見問題及答案解析(三)

嵌入式軟件C語言面試常見問題及答案解析(三) 上一篇已經足夠長了,再長也就有點不禮貌了,所以在這兒繼續來總結分享那個面試中遇到的題目,文中的問題和提供的答案或者代碼均代表個人的理解,如有不合理或者錯誤的地方,歡迎大家批評指正。 本文中題目列表 1. 編碼實現子串定…

HTML5實現好看的中秋節網頁源碼

HTML5實現好看的中秋節網頁源碼 前言一、設計來源1.1 網站首頁界面1.2 登錄注冊界面1.3 節日由來界面1.4 節日習俗界面1.5 節日文化界面1.6 節日美食界面1.7 節日故事界面1.8 節日民謠界面1.9 聯系我們界面 二、效果和源碼2.1 動態效果2.2 源代碼 源碼下載結束語 HTML5實現好看…

ROS通信編程——服務通信

前言 學完了話題通信其實操作流程基本都已經很熟悉了&#xff0c;因此服務通訊的學習就會流暢許多。 服務通信也是ROS中一種極其常用的通信模式&#xff0c;服務通信是基于請求響應模式的&#xff0c;是一種應答機制。也即: 一個節點A向另一個節點B發送請求&#xff0c;B接收…

零基礎微信小程序開發——全局配置之tabBar(保姆級教程+超詳細)

&#x1f3a5; 作者簡介&#xff1a; CSDN\阿里云\騰訊云\華為云開發社區優質創作者&#xff0c;專注分享大數據、Python、數據庫、人工智能等領域的優質內容 &#x1f338;個人主頁&#xff1a; 長風清留楊的博客 &#x1f343;形式準則&#xff1a; 無論成就大小&#xff0c;…

2024年12月HarmonyOS應用開發者高級認證全新題庫

注意事項&#xff1a;切記在考試之外的設備上打開題庫進行搜索&#xff0c;防止切屏三次考試自動結束&#xff0c;題目是亂序&#xff0c;每次考試&#xff0c;選項的順序都不同&#xff0c;作者已于2024年12月15日又更新了一波題庫&#xff0c;題庫正確率99%&#xff01; 新版…

【網絡協議】IPv4 地址分配 - 第二部分

前言 在第 1 部分中&#xff0c;我們學習了 IPv4 地址的分配方式&#xff0c;了解了各種類型的 IPv4 地址&#xff0c;并進行了基礎的子網劃分&#xff08;Subnetting&#xff09;。在第 2 部分中&#xff0c;我們將繼續學習子網劃分&#xff0c;并引入一些新的概念。 【網絡…

浙江安吉成新的分布式光伏發電項目應用

摘 要&#xff1a;分布式光伏發電站是指將光伏發電組件安裝在用戶的建筑物屋頂、空地或其他適合的場地上&#xff0c;利用太陽能進行發電的一種可再生能源利用方式&#xff0c;與傳統的大型集中式光伏電站相比&#xff0c;分布式光伏發電具有更靈活的布局、更低的建設成本和更高…

7z 安裝與使用指南

文章目錄 1. 安裝 7z1.1 在 Linux 上安裝 7z對于 Debian/Ubuntu 系統&#xff1a;對于 CentOS/RHEL 系統&#xff1a;對于 Fedora 系統&#xff1a;對于 Arch Linux 系統&#xff1a; 1.2 在 Windows 上安裝 7z 2. 使用 7z 進行壓縮和解壓2.1 壓縮文件示例&#xff1a;壓縮一個…

scanf:數據之舟的擺渡人,靜臥輸入港灣的詩意守候

大家好啊&#xff0c;我是小象?(?ω?)? 我的博客&#xff1a;Xiao Xiangζ????? 很高興見到大家&#xff0c;希望能夠和大家一起交流學習&#xff0c;共同進步。* 這一節我們主要來學習scanf的基本用法&#xff0c;了解scanf返回值&#xff0c;懂得scanf占位符和賦值…

【ROS2】Arduino系列之電機驅動實現

內容學自&#xff1a;趙虛左老師。學后總結&#xff01; 實現機器人移動的一種策略是&#xff1a;控制系統會先發布預期的車輛速度信息&#xff0c;然后驅動系統訂閱到該信息&#xff0c;不斷調整電機轉速直至達到預期速度&#xff0c;調速過程中還需要時時獲取實際速度并反饋…