koa-router路由參數(shù)和前端路由的結(jié)合詳解
koa-router 定制路由時(shí)支持通過冒號形式在 url 中指定參數(shù),該參數(shù)會掛載到 context 上然后可通過 context.params.paramName
方便地獲取。
考察下面的示例:
var Koa = require("koa"); var Router = require("koa-router"); var app = new Koa(); var router = new Router(); router.get("/user/:id", async function(ctx, next) { const userId = ctx.params.id; ctx.body = `user id is:${userId}`; }); app.use(router.routes()).use(router.allowedMethods()); app.listen(3000); console.log("server started at http:localhost:3000");
啟動服務(wù)后可看到頁面中展示出了從 url 中獲取到的 id 參數(shù)。
路由參數(shù)的獲取展示
現(xiàn)在來考慮另一種情況,即路由中支持前端路由的情況。
即把現(xiàn)在的 url 由 /user/:id 的形式擴(kuò)展成 /user/:id/foo/bar,這里 /foo/bar 部分可以是任何路由,作為前端處理的路由部分。
為了實(shí)現(xiàn)這樣的前端路由部分,服務(wù)端路由的配置需要借助正則來進(jìn)行,
- router.get("/user/:id", async function(ctx, next) { + router.get(["/user/:id", /\/user\/([\w|\d]+)\/.*/], async function(ctx, next) { const userId = ctx.params.id; ctx.body = `user id is:${userId}`; });
這里將路由中 url 由單個(gè)字符串變成了數(shù)組形式,第一個(gè)還是原來的路由,這樣正常的通過 /user/1 形式過來的頁面能命中該路由。同時(shí)添加 /\/user\/([\w|\d]+)\/.*/
部分,因?yàn)檎齽t情況下不再支持路由中通過冒號進(jìn)行參數(shù)的配置,所以這里 /user/ 后跟隨的 id 也需要使用正則來替換掉。
但正則匹配下的路由就不能通過 context.params
來訪問 url 上的參數(shù)了。不過好在可通過在正則中定義匹配組(Capturing Groups)的形式來定義參數(shù),即其中 ([\w|\d]+)
括號包裹的部分,稱為一個(gè)匹配組,一個(gè)匹配組是會自動被掛載到 context.params
上的,只是不像通過冒號定義的參數(shù)那樣會有一個(gè)名字,這種形式的參數(shù)按照匹配到的順序形成一個(gè)數(shù)組賦值到 context.params
,所以訪問第一個(gè)匹配組形成的參數(shù)可通過 context.params[0]
來獲取。
于是上面的代碼稍加修正后,就能夠正確處理來自命名參數(shù)(通過冒號匹配)或正則參數(shù)形成的 query 參數(shù)了。
- router.get("/user/:id", async function(ctx, next) { + router.get(["/user/:id", /\/user\/([\w|\d]+)\/.*/], async function(ctx, next) { - const userId = ctx.params.id; + const userId = ctx.params.id || ctx.params[0]; ctx.body = `user id is:${userId}`; });
最后完整的代碼會是這樣:
var Koa = require("koa"); var Router = require("koa-router"); var app = new Koa(); var router = new Router(); router.get(["/user/:id", /\/user\/([\w|\d]+)\/.*/], async function(ctx, next) { const userId = ctx.params.id || ctx.params[0]; ctx.body = `user id is:${userId}`; }); app.use(router.routes()).use(router.allowedMethods()); app.listen(3000); console.log("server started at http:localhost:3000");
此時(shí)訪問以下連接進(jìn)行測試,
- http://localhost:3000/user/1
- http://localhost:3000/user/2/foo
- http://localhost:3000/user/3/foo/bar
均能正確命中頁面并成功獲取到路由中的參數(shù)。
正則路由及路由參數(shù)的獲取
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。
相關(guān)文章
解決npm?i?報(bào)錯(cuò)以及python安裝卡住的問題
這篇文章主要介紹了解決npm?i?報(bào)錯(cuò)以及python安裝卡住的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10Node.JS更改Windows注冊表Regedit的方法小結(jié)
注冊表是windows操作系統(tǒng)中的一個(gè)核心數(shù)據(jù)庫,這里介紹一些通過node.js操作注冊表的幾種方法,感興趣的朋友參考下吧2017-08-08詳解nodejs中express搭建權(quán)限管理系統(tǒng)
本篇文章主要介紹了詳解express搭建權(quán)限管理系統(tǒng),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09npm安裝淘寶鏡像報(bào)錯(cuò)問題解決(npm install -g cnpm)
本文主要介紹了npm安裝淘寶鏡像報(bào)錯(cuò)問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01Node.js中多進(jìn)程模塊Cluster的介紹與使用
眾所周知Node.js是單線程的,一個(gè)單獨(dú)的Node.js進(jìn)程無法充分利用多核。Node.js從v0.6.0開始,新增cluster模塊,讓Node.js開發(fā)Web服務(wù)時(shí),很方便的做到充分利用多核機(jī)器。這篇文章主要給大家介紹了關(guān)于Node.js中多進(jìn)程模塊Cluster的相關(guān)資料,需要的朋友可以參考下2017-05-05