深入淺出Express.Router

Express是Node.js最流行的Web開發框架之一。在Express中,Express.Router是一個中間件容器,用於把路由處理器組織成一組相關的路由。在本文中,會從多個方面對Express.Router進行詳細的闡述。

一、基本用法

1.創建路由容器

在Express中,通過express.Router()方法來創建路由容器。下面是一個簡單的示例代碼:

const express = require('express');
const router = express.Router();

這裡我們創建了一個名為router的路由容器。

2.向路由容器添加路由處理器

在創建了路由容器之後,我們需要向容器中添加路由處理器,具體的方法有get()、post()、put()等,示例如下:

router.get('/', function(req, res) {
  res.send('Hello Router');
});

上面的代碼表示訪問根路徑時,路由會返回字元串’Hello Router’。

3.將路由容器掛載到主應用程序中

在添加了路由處理器後,我們需要將路由容器掛載到主應用程序中,代碼如下:

app.use('/', router);

其中,僅有一個參數’/’表示所有的請求都會被轉發到router,如果想要在請求中添加其他前綴,可以在第一個參數中指定。

二、動態路由

1.基本用法

動態路由是指路由中包含參數,這些參數可以是在路由中指定的,也可以是通過查詢字元串傳遞的。下面是一個簡單的動態路由示例:

router.get('/user/:name', function(req, res) {
  res.send('Hello, ' + req.params.name);
});

在這裡,我們通過冒號來指定了路由中的參數,然後在處理函數中通過req.params.name獲取了請求傳遞的參數。

2.佔位符規則

在路由中可以指定多個參數,這些參數遵循以下佔位符規則:

  • : 基本佔位符,用於匹配任意字元串,但不能匹配路徑分隔符
  • *: 匹配任何內容,包括路徑分隔符
  • (*): 匹配以指定字元結尾的路徑
  • (?:): 非捕獲匹配,匹配不再捕獲分組中的內容
  • + 、 ? 、 {} : 匹配長度,+ 表示必須有一個或多個,? 表示可選,{} 表示指定長度

三、路由匹配順序

在使用多個路由處理器時,路由的匹配順序將決定哪一個處理器會被執行。

1.路由的添加順序

Express.Router的路由匹配順序是按照它們被添加的順序進行的。因此,如果你先添加一個無參數的路由處理器,然後再添加一個與之匹配但卻包含了參數的處理器,那麼前一個處理器將始終被執行。例如:

router.get('/', function(req, res) {
  res.send('Root');
});

router.get('/:name', function(req, res) {
  res.send('Hello, ' + req.params.name);
});

在這裡,如果訪問根路徑,那麼將執行第一個路由處理器;如果訪問/user,那麼將執行第二個處理器。

2.靜態路由優先

匹配靜態路由要優先於動態路由。例如:

router.get('/user/:id', function(req, res) {
  res.send('User ID: ' + req.params.id);
});

router.get('/user/profile', function(req, res) {
  res.send('User Profile');
});

在這裡,如果訪問/user/profile路徑,將會匹配到第二個靜態路由處理器,而不是第一個動態路由處理器。

四、路由處理器中間件

除了可以通過use()方法來添加中間件之外,我們還可以通過分別掛載中間件到路由處理器上來對特定路由進行處理。

1.基本用法

通過在路由處理器上掛載中間件,這個中間件將僅應用於該路由。下面是一個簡單的示例:

router.get('/user/:id', function(req, res, next) {
  const UserType = getUserType(req.params.id);
  req.userType = UserType;
  next();
}, function(req, res) {
  res.send('User Type: ' + req.userType);
});

在這裡,我們在第一個處理器的函數中設置了req.userType的值,並將請求轉到下一個處理器。

2.使用多個中間件

我們還可以使用多個中間件,類似於在主應用程序中使用多個中間件。下面是一個示例:

router.get('/user/:id',function(req,res,next){
  const UserType = getUserType(req.params.id);
  req.userType = UserType;
  next();
},
function(req,res,next){
  const token = getToken(req);
  if(token){
    req.token = token;
    next();
  } else {
    res.status(401).send('Unauthorized');
  }
},
function(req,res){
  res.send('User Type: ' + req.userType + ' Token: ' + req.token);
});

在這裡,我們使用了3個中間件,第一個中間件將req.userType設置為一個值,第二個中間件將req.token設置為值或拋出錯誤,第三個中間件將數據發送回客戶端。

五、總結

Express.Router是一個非常便利的中間件容器,可以將路由處理器分組,更加優雅、靈活地處理路由。在本文中,我們介紹了基本的使用方法,動態路由,路由匹配順序和路由處理器中間件。希望這篇文章對你了解Express.Router提供了幫助。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/183527.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-25 05:47
下一篇 2024-11-25 05:47

相關推薦

  • Vue Router Props詳解

    一、基礎概念 Vue Router是Vue.js官方的路由管理器,可以讓我們通過組件化的方式構建單頁應用,根據不同的路徑展示不同的組件。在Vue Router中,我們可以通過pro…

    編程 2025-04-25
  • 深入淺出統計學

    統計學是一門關於收集、分析、解釋和呈現數據的學科。它在各行各業都有廣泛應用,包括社會科學、醫學、自然科學、商業、經濟學、政治學等等。深入淺出統計學是指想要學習統計學的人能夠理解統計…

    編程 2025-04-25
  • 深入淺出torch.autograd

    一、介紹autograd torch.autograd 模塊是 PyTorch 中的自動微分引擎。它支持任意數量的計算圖,可以自動執行前向傳遞、後向傳遞和計算梯度,同時提供很多有用…

    編程 2025-04-24
  • 深入淺出SQL佔位符

    一、什麼是SQL佔位符 SQL佔位符是一種佔用SQL語句中某些值的標記或佔位符。當執行SQL時,將使用該標記替換為實際的值,並將這些值傳遞給查詢。SQL佔位符使查詢更加安全,防止S…

    編程 2025-04-24
  • 深入淺出:理解nginx unknown directive

    一、概述 nginx是目前使用非常廣泛的Web伺服器之一,它可以運行在Linux、Windows等不同的操作系統平台上,支持高並發、高擴展性等特性。然而,在使用nginx時,有時候…

    編程 2025-04-24
  • 深入淺出ThinkPHP框架

    一、簡介 ThinkPHP是一款開源的PHP框架,它遵循Apache2開源協議發布。ThinkPHP具有快速的開發速度、簡便的使用方式、良好的擴展性和豐富的功能特性。它的核心思想是…

    編程 2025-04-24
  • 深入淺出arthas火焰圖

    arthas是一個非常方便的Java診斷工具,包括很多功能,例如JVM診斷、應用診斷、Spring應用診斷等。arthas使診斷問題變得更加容易和準確,因此被廣泛地使用。artha…

    編程 2025-04-24
  • 深入淺出AWK -v參數

    一、功能介紹 AWK是一種強大的文本處理工具,它可以用於數據分析、報告生成、日誌分析等多個領域。其中,-v參數是AWK中一個非常有用的參數,它用於定義一個變數並賦值。下面讓我們詳細…

    編程 2025-04-24
  • 深入淺出Markdown文字顏色

    一、Markdown文字顏色的背景 Markdown是一種輕量級標記語言,由於其簡單易學、易讀易寫,被廣泛應用於博客、文檔、代碼注釋等場景。Markdown支持使用HTML標籤,因…

    編程 2025-04-23
  • 深入淺出runafter——非同步任務調度器的實現

    一、runafter是什麼? runafter是一個基於JavaScript實現的非同步任務調度器,可以幫助開發人員高效地管理非同步任務。利用runafter,開發人員可以輕鬆地定義和…

    編程 2025-04-23

發表回復

登錄後才能評論