koa-router路由參數(shù)和前端路由的結(jié)合詳解
koa-router 定制路由時(shí)支持通過(guò)冒號(hào)形式在 url 中指定參數(shù),該參數(shù)會(huì)掛載到 context 上然后可通過(guò) 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");
啟動(dòng)服務(wù)后可看到頁(yè)面中展示出了從 url 中獲取到的 id 參數(shù)。

路由參數(shù)的獲取展示
現(xiàn)在來(lái)考慮另一種情況,即路由中支持前端路由的情況。
即把現(xiàn)在的 url 由 /user/:id 的形式擴(kuò)展成 /user/:id/foo/bar,這里 /foo/bar 部分可以是任何路由,作為前端處理的路由部分。
為了實(shí)現(xiàn)這樣的前端路由部分,服務(wù)端路由的配置需要借助正則來(lái)進(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è)還是原來(lái)的路由,這樣正常的通過(guò) /user/1 形式過(guò)來(lái)的頁(yè)面能命中該路由。同時(shí)添加 /\/user\/([\w|\d]+)\/.*/ 部分,因?yàn)檎齽t情況下不再支持路由中通過(guò)冒號(hào)進(jìn)行參數(shù)的配置,所以這里 /user/ 后跟隨的 id 也需要使用正則來(lái)替換掉。
但正則匹配下的路由就不能通過(guò) context.params 來(lái)訪問(wèn) url 上的參數(shù)了。不過(guò)好在可通過(guò)在正則中定義匹配組(Capturing Groups)的形式來(lái)定義參數(shù),即其中 ([\w|\d]+) 括號(hào)包裹的部分,稱為一個(gè)匹配組,一個(gè)匹配組是會(huì)自動(dòng)被掛載到 context.params 上的,只是不像通過(guò)冒號(hào)定義的參數(shù)那樣會(huì)有一個(gè)名字,這種形式的參數(shù)按照匹配到的順序形成一個(gè)數(shù)組賦值到 context.params,所以訪問(wèn)第一個(gè)匹配組形成的參數(shù)可通過(guò) context.params[0] 來(lái)獲取。
于是上面的代碼稍加修正后,就能夠正確處理來(lái)自命名參數(shù)(通過(guò)冒號(hào)匹配)或正則參數(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}`;
});
最后完整的代碼會(huì)是這樣:
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í)訪問(wèn)以下連接進(jìn)行測(cè)試,
- http://localhost:3000/user/1
- http://localhost:3000/user/2/foo
- http://localhost:3000/user/3/foo/bar
均能正確命中頁(yè)面并成功獲取到路由中的參數(shù)。

正則路由及路由參數(shù)的獲取
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
NodeJS基礎(chǔ)API搭建服務(wù)器詳細(xì)過(guò)程記錄
本文將以一個(gè)超小型web項(xiàng)目,來(lái)詳細(xì)介紹如何使用NodeJS基礎(chǔ)的http, fs, path, url等模塊提供的API來(lái)搭建一個(gè)簡(jiǎn)單的web服務(wù)器。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
Nodejs讀取文件時(shí)相對(duì)路徑的正確寫法(使用fs模塊)
本篇文章主要介紹了linux 環(huán)境 mysql寫入中文報(bào)錯(cuò)的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
Node.JS用純JavaScript生成圖片或滑塊式驗(yàn)證碼功能
有一些Node.JS圖片生成類庫(kù),比如node-captcha等的類庫(kù),需要c/c++程序生成圖片??缙脚_(tái)部署不是很方便。這里介紹幾個(gè)用純JS實(shí)現(xiàn)的圖片驗(yàn)證碼生成模塊,需要的朋友可以參考下2019-09-09
詳解nodeJS之二進(jìn)制buffer對(duì)象
本篇文章主要介紹了nodeJS之二進(jìn)制buffer對(duì)象,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
Node.js?連接?MySql?統(tǒng)計(jì)組件屬性的使用情況解析
這篇文章主要為大家介紹了Node.js?連接?MySql?統(tǒng)計(jì)組件屬性的使用情況解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
微信小程序搭載node.js服務(wù)器的簡(jiǎn)單教程
小程序是一種全新的連接用戶與服務(wù)的方式,它可以在微信內(nèi)被便捷地獲取和傳播,同時(shí)具有出色的使用體驗(yàn),下面這篇文章主要給大家介紹了關(guān)于微信小程序搭載node.js服務(wù)器的簡(jiǎn)單教程,需要的朋友可以參考下2022-12-12
NodeJS使用遞歸算法和遍歷算法來(lái)遍歷目錄的方法
遍歷目錄是操作文件時(shí)的一個(gè)常見(jiàn)需求,比如寫一個(gè)程序,需要找到并處理指定目錄下的所有JS文件時(shí),就需要遍歷整個(gè)目錄,NodeJS遍歷目錄可以使用遞歸算法、遍歷算法,遍歷算法又分為同步遍歷、異步遍歷兩種,本文介紹NodeJS使用遞歸算法和遍歷算法來(lái)遍歷目錄的方法2023-11-11

