福州外文網(wǎng)站建設(shè)網(wǎng)絡(luò)推廣平臺幾大類
個人簡介
👀個人主頁: 前端雜貨鋪
🙋?♂?學(xué)習(xí)方向: 主攻前端方向,正逐漸往全干發(fā)展
📃個人狀態(tài): 研發(fā)工程師,現(xiàn)效力于中國工業(yè)軟件事業(yè)
🚀人生格言: 積跬步至千里,積小流成江海
🥇推薦學(xué)習(xí):🍍前端面試寶典 🎨100個小功能 🍉Vue2 🍋Vue3 🍓Vue2/3項目實(shí)戰(zhàn) 🥝Node.js實(shí)戰(zhàn) 🍒Three.js🌕個人推廣:每篇文章最下方都有加入方式,旨在交流學(xué)習(xí)&資源分享,快加入進(jìn)來吧
內(nèi)容 | 參考鏈接 |
---|---|
Node.js(一) | Node.js——fs(文件系統(tǒng))模塊 |
Node.js(二) | Node.js——path(路徑操作)模塊 |
Node.js(三) | Node.js——http 模塊(一) |
Node.js(四) | Node.js——http 模塊(二) |
Node.js(五) | Node.js——express項目搭建、請求、響應(yīng) |
文章目錄
- 前言
- 中間件概念
- 全局中間件
- 路由中間件
- 靜態(tài)資源中間件
- 總結(jié)
前言
上篇文章我們學(xué)習(xí)了如何搭建 Express 項目,并認(rèn)識了請求和響應(yīng)的相關(guān)知識。
這篇文章我們來認(rèn)識一下 Express 中的一個重要概念 => 中間件。
中間件概念
中間件(Middleware)本質(zhì)上是一個回調(diào)函數(shù),中間件函數(shù)可以像路由一樣訪問請求對象和響應(yīng)對象。
中間件的作用:使用函數(shù)封裝公共組件,簡化代碼。
中間件類型:全局中間件、路由中間件。
全局中間件
全局中間件是應(yīng)用于整個應(yīng)用程序的中間件,即所有請求都會經(jīng)過這些中間件。它們通常用于執(zhí)行一些全局的任務(wù)。
- 日志記錄:記錄每個請求的詳細(xì)信息,如請求方法、URL、狀態(tài)碼、響應(yīng)時間等。
- 錯誤處理:捕獲和處理應(yīng)用程序中發(fā)生的錯誤,確保服務(wù)器不會因?yàn)槲刺幚淼漠惓6罎ⅰ?/li>
- 跨域資源共享(CORS):允許或拒絕來自不同源的請求,以支持跨域請求。
- 靜態(tài)文件服務(wù):為應(yīng)用程序提供靜態(tài)文件(如HTML、CSS、JavaScript、圖片等)。
- 請求體解析:解析請求體中的JSON、URL編碼的數(shù)據(jù)或表單數(shù)據(jù)。
- 身份驗(yàn)證:驗(yàn)證請求是否來自已認(rèn)證的用戶,并添加用戶信息到請求對象中。
const express = require("express");const app = express();
const fs = require("fs");
const path = require("path");// 聲明中間件函數(shù)
function recordMiddleware(req, res, next) {const { url, ip } = req;// 將信息保存在文件中fs.appendFileSync(path.resolve(__dirname, "./access.log"),`${url} ${ip}\r\n`);// 放行next();
}// 使用中間件函數(shù)
app.use(recordMiddleware);app.get("/home", (req, res) => {res.send("前臺首頁");
});app.get("/admin", (req, res) => {res.send("后臺首頁");
});app.get("*", (req, res) => {res.send("Not Found");
});app.listen(3000, () => {console.log("服務(wù)已啟動,端口 3000 正在監(jiān)聽中...");
});
路由中間件
路由中間件是應(yīng)用于特定路由或路由組的中間件,只有匹配到這些路由的請求才會經(jīng)過這些中間件。它們通常用于執(zhí)行一些與特定路由相關(guān)的任務(wù)。
- 特定路由的日志記錄:只記錄特定路由的請求信息。
- 特定路由的身份驗(yàn)證:只對特定路由進(jìn)行身份驗(yàn)證,例如,只有某些API端點(diǎn)需要身份驗(yàn)證。
- 數(shù)據(jù)驗(yàn)證和格式化:在將數(shù)據(jù)傳遞給路由處理程序之前,驗(yàn)證和格式化請求數(shù)據(jù)。
- 條件性路由處理:根據(jù)某些條件決定是否繼續(xù)處理請求或重定向到其他路由。
const express = require("express");const app = express();// 聲明路由中間件函數(shù)
let checkCodeMiddleware = (req, res, next) => {// 當(dāng)攜帶的 code 為 666 時才放行,不然提示 “暗號錯誤”if (req.query.code === "666") {next();} else {res.send("暗號錯誤");}
};// 第二個參數(shù)的位置使用路由中間件
app.get("/home", checkCodeMiddleware, (req, res) => {res.send("前臺首頁");
});app.get("/admin", checkCodeMiddleware, (req, res) => {res.send("后臺首頁");
});app.get("*", (req, res) => {res.send("Not Found");
});app.listen(3000, () => {console.log("服務(wù)已啟動,端口 3000 正在監(jiān)聽中...");
});
靜態(tài)資源中間件
通過 app.use(express.static(__dirname) + "/public")
來添加靜態(tài)資源中間件。
靜態(tài)資源應(yīng)放入 public
文件夾中,我們創(chuàng)建如下的目錄結(jié)構(gòu)。
注意事項:
- index.html 文件為默認(rèn)打開的資源。
- 如果靜態(tài)資源與路由規(guī)則同時匹配,誰先匹配誰就響應(yīng)。
- 路由響應(yīng)動態(tài)資源,靜態(tài)資源應(yīng)由中間件響應(yīng)。
const express = require("express");const app = express();app.use(express.static(__dirname + "/public"));app.get("/home", (req, res) => {res.send("前臺首頁");
});app.listen(3000, () => {console.log("服務(wù)已啟動,端口 3000 正在監(jiān)聽中...");
});
總結(jié)
本篇文章我們學(xué)習(xí)了中間件的使用,包括 全局中間件、路由中間件和靜態(tài)資源中間件,它們都有各自的使用場景,它們本質(zhì)上都是一個回調(diào)函數(shù),主要用于 請求預(yù)處理、響應(yīng)后處理、錯誤處理、日志記錄、權(quán)限控制、性能優(yōu)化 等。
好啦,本篇文章到這里就要和大家說再見啦,祝你這篇文章閱讀愉快,你下篇文章的閱讀愉快留著我下篇文章再祝!
參考資料:
- Node.js教程(菜鳥教程)
- Node.js零基礎(chǔ)視頻教程(尚硅谷 · 李強(qiáng))