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