nodejs之express的中間件

来源:https://www.cnblogs.com/easth/archive/2019/07/18/express_middlewear.html
-Advertisement-
Play Games

express中間件分成三種 內置中間件 static 自定義中間件 第三方中間件 (body-parser) (攔截器) 全局自定義中間件 在請求介面時 有幾個介面都要驗證傳來的內容是否存在或者是否正確 不可能每個介面都寫一段驗證,所以這一段驗證可以提取出來,通過中間件實現 const expre ...


express中間件分成三種

內置中間件 static

自定義中間件 第三方中間件 (body-parser) (攔截器)

 

全局自定義中間件

 

在請求介面時 有幾個介面都要驗證傳來的內容是否存在或者是否正確 不可能每個介面都寫一段驗證,所以這一段驗證可以提取出來,通過中間件實現
const express = require("express");
const app = express();

//  test1介面
app.get("/test1",(req,res) => {
    res.send("test1 ok")
})
//  test2介面
app.get("/test2",(req,res) => {
    res.send("test2 ok")
})
//  開啟伺服器
app.listen(2000,() => {
    console.log('開啟在2000埠');
})
現在要做的是在請求test1和test2的時候 看請求中有沒有帶上需要的欄位 token app.use() 第一種中間件 可以說是攔截器 第一個參數是路徑 第二個參數是回調函數 回調函數中有req res next
const express = require("express");
const app = express();

app.use("/",(req,res,next)=>{
    console.log("中間件")
})
//  test1介面
app.get("/test1",(req,res) => {
    console.log('test1');
    res.send("test1 ok")
})
//  test2介面
app.get("/test2",(req,res) => {
    console.log('test2');
    res.send("test2 ok")
})
//  開啟伺服器
app.listen(2000,() => {
    console.log('開啟在2000埠');
})

現在在瀏覽器中請求/test1 沒有響應,在終端中列印出來

這個中間件的作用在於 請求/開頭的路徑時 優先走中間件的回調函數 中間件里的next()表示是否繼續往下執行 ,有next()就繼續往下走, 沒有next()就不往下走

 

const express = require("express");
const app = express();

app.use("/",(req,res,next)=>{
    console.log("中間件")
    next()  //  是否繼續往下執行
})
//  test1介面
app.get("/test1",(req,res) => {
    console.log('test1');
    res.send("test1 ok")
})
//  test2介面
app.get("/test2",(req,res) => {
    console.log('test2');
    res.send("test2 ok")
})
//  開啟伺服器
app.listen(2000,() => {
    console.log('開啟在2000埠');
})

頁面中

終端列印

簡單來說 在來到/test1介面之前 有個攔截器,這個攔截器中的路徑是/, 所有的介面都先走這個攔截器,在這個攔截器里做邏輯處理,允許它繼續往下走就加next() ,不允許往下走就不用加next(), 因此驗證上文提到的token,就可以在中間件里進行

const express = require("express");
const app = express();

app.use("/",(req,res,next)=>{
    console.log("中間件")
    let {token} = req.query;
    if(token){
        next()  //  是否繼續往下執行
    }else{
        res.send("缺少token")
    }
})
//  test1介面
app.get("/test1",(req,res) => {
    console.log('test1');
    res.send(`test1 token為${req.query.token}`)
})
//  test2介面
app.get("/test2",(req,res) => {
    console.log('test2');
    res.send(`test2 token為${req.query.token}`)
})
//  開啟伺服器
app.listen(2000,() => {
    console.log('開啟在2000埠');
})

瀏覽器中訪問/test1 不帶token欄位

現在帶上token欄位訪問/test2

這就實現了通過中間件做全局攔截,這種中間件屬於自定義攔截器.如果app.use()的第一個參數是 / 表示路徑,則第一個參數可以不寫,如下

app.use("/",(req,res,next)=>{
    next()  //  是否繼續往下執行
})

等同於

app.use((req,res,next)=>{
    next()  //  是否繼續往下執行
})

這也可以說為什麼body-parser是一個中間件

const bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())
在使用bodyParser.json()的時候也是在app.use()方法里跟了一個函數。 中間件的使用 在app.use()里 可以加上一個回調函數,在回調函數里做一些處理 需要註意的是在合適的時機 使用next()繼續執行後面的操作 為什麼說這一種是全局的 ,因為所有的介面都走這裡 接下來看局部中間件 局部中間件 第一個參數還是路徑 第二個參數是一個function 第三個參數還是function
const express = require("express");
const app = express();

app.get("/demo",(req,res,next) => {
    console.log('fun1');
},(req,res) => {
    console.log('fun2');
})
//  開啟伺服器
app.listen(2000,() => {
    console.log('開啟在2000埠');
})
現在請求/demo介面 瀏覽器中沒有響應 因為第一個回調函數里沒有next() 不會走到第二個回調函數里 終端列印

在第一個回調函數中加上next()看看

const express = require("express");
const app = express();

app.get("/demo",(req,res,next) => {
    console.log('fun1');
    next()
},(req,res) => {
    res.send("fun2")
    console.log('fun2');
})
//  開啟伺服器
app.listen(2000,() => {
    console.log('開啟在2000埠');
})

瀏覽器中訪問/demo

終端列印

這種叫局部中間件,局部中間件是 在哪個介面里寫就只對哪個介面有用,局部中間件可以寫無數個 只要在合適的地方使用next()就可以一個接一個的往下執行,一般情況下使用局部中間件最多使用一兩個就夠了 使用多個局部中間件 代碼結構如下

app.get("/test",fun1,fun2,fun3,fun4,fun5..)

內置中間件 static 又叫靜態資源目錄 類似於apache的靜態目錄 指定目錄後把圖片 網頁 文件放進去 直接可以訪問到 在項目目錄新建一個文件夾 public 隨便起名,用作靜態資源目錄 只要是中間件都是用app.use()方法
app.use(express.static("./public"))

在public目錄下新建一個index.html文件 寫上內容

瀏覽器訪問/index.html

 

這樣是直接訪問靜態目錄,如果在public目錄下還有目錄,在瀏覽器中地址欄/後輸入public下的目錄的文件也可以訪問到 還有另一種寫法
app.use("/",express.static("./public"))
訪問的地址不變 依然可以打開頁面,因為路徑名字是/時 第一個參數可以省去 如果想定義用戶輸入的路徑 就改第一個參數
app.use("/public/test/",express.static("./public"))

瀏覽器訪問時應該輸/public/test/index.html了

總結 在express中 無論是app.get 還是app.post app.use 只要方法里第一個參數有路徑 都會和瀏覽器訪問的路徑做對比 如果匹配上了就走當前的方法 如果在app.use 和 app.get app.post 的第一個參數中 有相同的路徑 ,當用戶訪問時會優先走到app.use()的方法里 因為app.use()是一個攔截器
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天我在學習jQuery的addClass操作時遇到了一個小問題,想來跟大家分享一下,避免初學者踩坑。 我的需求是製作一個表格,並讓它隔行換色,在此基礎上再加上滑鼠懸浮變色的效果。(主要訓練jQuery選擇器和addClass) 但是在我真正操作後發現我的奇數行都變色了,而偶數行都沒有變。具體效果如 ...
  • css的動畫效果在style標簽中用@keyframes name{。。。}的形式定義,使用animation:name time 。。。的形式進行調用。 示例: <style> div{width:100px;height:100px;background:red;position:relativ ...
  • css3的2d轉化,我所知的有5種。 因為是css屬性,所以必然,2d轉化的設置在style中設置基本格式,transform:XXX;以選擇哪種轉化,還可以設置transition:time;以設置轉化時間(不過不能設置在初始狀態下,否則無效) 下麵按標號進行介紹: 1.translate 有2種 ...
  • 學習中,這篇是試驗品 ...
  • 邊框的陰影效果,可以在css中使用box-shadow來實現 屬性值有X-shadow,Y-shadow,blur,spread,color,inset X-shadow是設置水平方向的陰影值,可為負數 Y-shadow是設置垂直方向的陰影值,可為負數 blur是設置陰影的模糊半徑 spread是設 ...
  • 先說比較普遍的就是滑動的下拉菜單,可以通過CSS來做,也可以用JS做 都挺簡單的,主要是通過父元素觸發,然後在子元素能夠保持住父元素的狀態。 都是用原生寫的。 CSS實現方法: JS實現方法: 第二種比較簡單,就是點擊按鈕觸發二級菜單,只能通過JS觸發。 這個就是做一個判斷,也不難。這個效果是只能來 ...
  • 一、wx:showActionSheet(上拉菜單) 二、wx:showModal(彈窗) 三、showToast / hideToast(載入) Object object 屬性類型預設值必填說明 success function 否 介面調用成功的回調函數 fail function 否 介面調 ...
  • 普通的插槽裡面的數據是在父組件里定義的,而作用域插槽里的數據是在子組件定義的。 有時候作用域插槽很有用,比如使用Element-ui表格自定義模板時就用到了作用域插槽,Element-ui定義了每個單元格數據的顯示格式,我們可以通過作用域插槽自定義數據的顯示格式,對於二次開發來說具有很強的擴展性。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...