Express.js怎樣設(shè)置路由參數(shù)?

express.JS中定義帶參數(shù)的路由需使用冒號(hào):,并通過(guò)req.params訪問(wèn)。例如,app.get(‘/users/:userid’, …)定義了動(dòng)態(tài)用戶id路由,當(dāng)訪問(wèn)/users/123時(shí),req.params.userid會(huì)獲取值123;req.params對(duì)象用于訪問(wèn)所有路由參數(shù),如路由為/products/:category/:productid,訪問(wèn)/products/electronics/456時(shí),req.params包含category和productid;路由參數(shù)順序重要,按定義順序解析url,錯(cuò)誤順序會(huì)導(dǎo)致錯(cuò)誤的數(shù)據(jù)匹配;處理可選參數(shù)可通過(guò)多路由或查詢參數(shù)實(shí)現(xiàn),如/search/:keyword/:category和/search,后者通過(guò)req.query獲取可選參數(shù);驗(yàn)證路由參數(shù)可用isnan、parseint等方法檢查類型,也可使用express-validator庫(kù)進(jìn)行更復(fù)雜驗(yàn)證。

Express.js怎樣設(shè)置路由參數(shù)?

Express.js 中設(shè)置路由參數(shù),簡(jiǎn)單來(lái)說(shuō),就是用冒號(hào) : 來(lái)定義路由中的動(dòng)態(tài)部分,然后通過(guò) req.params 對(duì)象來(lái)訪問(wèn)這些參數(shù)。這樣你就可以根據(jù) URL 的不同部分執(zhí)行不同的操作,比如根據(jù)用戶 ID 顯示不同的用戶資料。

Express.js怎樣設(shè)置路由參數(shù)?

Express.js 路由參數(shù)設(shè)置的關(guān)鍵在于使用冒號(hào)定義參數(shù),并通過(guò) req.params 訪問(wèn)。理解并熟練運(yùn)用這些技巧,可以構(gòu)建靈活且功能強(qiáng)大的 Web 應(yīng)用。

Express.js怎樣設(shè)置路由參數(shù)?

如何定義帶參數(shù)的路由?

在 Express.js 中,你可以使用冒號(hào) : 來(lái)定義路由參數(shù)。例如,如果你想創(chuàng)建一個(gè)路由來(lái)顯示特定 ID 的用戶資料,你可以這樣定義路由:

app.get('/users/:userId', (req, res) => {   const userId = req.params.userId;   // 根據(jù) userId 查詢數(shù)據(jù)庫(kù)或其他操作   res.send(`User ID: ${userId}`); });

在這個(gè)例子中,/users/:userId 定義了一個(gè)帶有參數(shù)的路由。當(dāng)用戶訪問(wèn)類似 /users/123 的 URL 時(shí),123 就會(huì)被捕獲并賦值給 req.params.userId。 你就可以在路由處理函數(shù)中使用 req.params.userId 來(lái)獲取這個(gè)值,并進(jìn)行相應(yīng)的處理。

Express.js怎樣設(shè)置路由參數(shù)?

req.params 對(duì)象有什么用?

req.params 對(duì)象是 Express.js 提供的一個(gè)非常有用的工具,它允許你訪問(wèn)路由中定義的所有參數(shù)。它是一個(gè) JavaScript 對(duì)象,其中包含了所有通過(guò)冒號(hào)定義的參數(shù)及其對(duì)應(yīng)的值。

例如,如果你的路由定義是 /products/:category/:productId,當(dāng)用戶訪問(wèn) /products/electronics/456 時(shí),req.params 對(duì)象將會(huì)是:

{   category: 'electronics',   productId: '456' }

你可以通過(guò) req.params.category 和 req.params.productId 來(lái)訪問(wèn)這兩個(gè)參數(shù)的值。這使得你可以輕松地根據(jù) URL 的不同部分執(zhí)行不同的操作,比如根據(jù)商品類別和 ID 從數(shù)據(jù)庫(kù)中檢索商品信息。

路由參數(shù)的順序重要嗎?

路由參數(shù)的順序非常重要。Express.js 會(huì)按照路由定義中參數(shù)出現(xiàn)的順序來(lái)解析 URL。例如,如果你的路由定義是 /articles/:year/:month/:day,那么 URL /articles/2023/10/26 會(huì)被解析為 year = 2023, month = 10, day = 26。

如果你改變了路由參數(shù)的順序,比如 /articles/:month/:day/:year,那么相同的 URL /articles/2023/10/26 將會(huì)被解析為 month = 2023, day = 10, year = 26,這顯然不是你想要的結(jié)果。

因此,在定義路由時(shí),一定要仔細(xì)考慮參數(shù)的順序,確保它與你的 URL 結(jié)構(gòu)一致。

如何處理可選的路由參數(shù)?

有時(shí)候,你可能希望某些路由參數(shù)是可選的。例如,你可能有一個(gè)搜索功能,允許用戶根據(jù)關(guān)鍵詞或類別進(jìn)行搜索,但這兩個(gè)參數(shù)都可以省略。

Express.js 本身并沒(méi)有直接支持可選路由參數(shù)的語(yǔ)法。但是,你可以通過(guò)一些技巧來(lái)實(shí)現(xiàn)這個(gè)功能。一種常見(jiàn)的方法是定義多個(gè)路由來(lái)處理不同的情況。

例如:

// 處理帶有關(guān)鍵詞和類別的搜索 app.get('/search/:keyword/:category', (req, res) => {   const keyword = req.params.keyword;   const category = req.params.category;   // 根據(jù)關(guān)鍵詞和類別進(jìn)行搜索   res.send(`Search results for keyword: ${keyword}, category: ${category}`); });  // 處理只帶有關(guān)鍵詞的搜索 app.get('/search/:keyword', (req, res) => {   const keyword = req.params.keyword;   // 根據(jù)關(guān)鍵詞進(jìn)行搜索   res.send(`Search results for keyword: ${keyword}`); });  // 處理沒(méi)有參數(shù)的搜索(顯示所有結(jié)果) app.get('/search', (req, res) => {   // 顯示所有搜索結(jié)果   res.send('All search results'); });

在這個(gè)例子中,我們定義了三個(gè)路由來(lái)處理不同的搜索情況。當(dāng)用戶訪問(wèn) /search/example/books 時(shí),第一個(gè)路由會(huì)被觸發(fā)。當(dāng)用戶訪問(wèn) /search/example 時(shí),第二個(gè)路由會(huì)被觸發(fā)。當(dāng)用戶訪問(wèn) /search 時(shí),第三個(gè)路由會(huì)被觸發(fā)。

這種方法雖然簡(jiǎn)單,但當(dāng)可選參數(shù)的數(shù)量增加時(shí),路由的數(shù)量也會(huì)迅速增加,使代碼變得難以維護(hù)。

另一種更靈活的方法是使用查詢參數(shù)(query parameters)來(lái)處理可選參數(shù)。

查詢參數(shù)和路由參數(shù)有什么區(qū)別

查詢參數(shù)和路由參數(shù)都是用于傳遞數(shù)據(jù)的,但它們的使用方式和適用場(chǎng)景有所不同。

路由參數(shù)是 URL 路徑的一部分,通過(guò)冒號(hào) : 定義。它們通常用于標(biāo)識(shí)特定的資源,比如用戶 ID、商品 ID 等。路由參數(shù)是 URL 結(jié)構(gòu)的核心組成部分,它們定義了資源的層級(jí)關(guān)系。

查詢參數(shù)則位于 URL 的問(wèn)號(hào) ? 之后,以鍵值對(duì)的形式出現(xiàn)。例如,/search?keyword=example&category=books。查詢參數(shù)通常用于傳遞可選的、非關(guān)鍵性的數(shù)據(jù),比如搜索關(guān)鍵詞、過(guò)濾條件、排序方式等。

與路由參數(shù)不同,查詢參數(shù)的順序并不重要。?keyword=example&category=books 和 ?category=books&keyword=example 的含義是相同的。

在 Express.js 中,你可以通過(guò) req.query 對(duì)象來(lái)訪問(wèn)查詢參數(shù)。例如:

app.get('/search', (req, res) => {   const keyword = req.query.keyword;   const category = req.query.category;    if (keyword && category) {     // 根據(jù)關(guān)鍵詞和類別進(jìn)行搜索     res.send(`Search results for keyword: ${keyword}, category: ${category}`);   } else if (keyword) {     // 根據(jù)關(guān)鍵詞進(jìn)行搜索     res.send(`Search results for keyword: ${keyword}`);   } else {     // 顯示所有搜索結(jié)果     res.send('All search results');   } });

使用查詢參數(shù)的優(yōu)點(diǎn)是,你可以輕松地處理多個(gè)可選參數(shù),而無(wú)需定義大量的路由。此外,查詢參數(shù)也更易于理解和維護(hù)。

如何驗(yàn)證路由參數(shù)的有效性?

在處理路由參數(shù)時(shí),驗(yàn)證參數(shù)的有效性非常重要。例如,如果你的路由需要一個(gè)數(shù)字類型的用戶 ID,你需要確保 req.params.userId 確實(shí)是一個(gè)數(shù)字,而不是其他類型的值。

你可以使用各種方法來(lái)驗(yàn)證路由參數(shù)的有效性。一種簡(jiǎn)單的方法是使用 JavaScript 的內(nèi)置函數(shù),比如 isNaN() 和 parseInt()。

例如:

app.get('/users/:userId', (req, res) => {   const userId = req.params.userId;    if (isNaN(userId)) {     // userId 不是一個(gè)數(shù)字     return res.status(400).send('Invalid user ID');   }    const userIdInt = parseInt(userId, 10); // 將 userId 轉(zhuǎn)換為整數(shù)    // 根據(jù) userIdInt 查詢數(shù)據(jù)庫(kù)或其他操作   res.send(`User ID: ${userIdInt}`); });

在這個(gè)例子中,我們首先使用 isNaN() 函數(shù)來(lái)檢查 userId 是否是一個(gè)數(shù)字。如果不是,我們返回一個(gè) 400 錯(cuò)誤,表示請(qǐng)求無(wú)效。如果是,我們使用 parseInt() 函數(shù)將 userId 轉(zhuǎn)換為整數(shù)。

除了使用 JavaScript 的內(nèi)置函數(shù)外,你還可以使用第三方庫(kù)來(lái)進(jìn)行更復(fù)雜的參數(shù)驗(yàn)證。例如,express-validator 是一個(gè)流行的 Express.js 中間件,它可以幫助你輕松地驗(yàn)證請(qǐng)求中的各種數(shù)據(jù),包括路由參數(shù)、查詢參數(shù)、請(qǐng)求體等。

使用 express-validator 可以使你的代碼更簡(jiǎn)潔、更易于維護(hù),并且可以提供更詳細(xì)的錯(cuò)誤信息。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享
站長(zhǎng)的頭像-小浪學(xué)習(xí)網(wǎng)月度會(huì)員