一、基礎概念
Koa-router是一個基於Koa開發的路由中間件,可以實現針對不同的URL請求進行不同的響應。
相較於Koa本身提供的路由功能,常規的使用方式就是根據請求的方法(GET/POST/PUT/DELETE等)和URL進行匹配,然後執行相應的業務邏輯。Koa-router則更加靈活,可以根據正則表達式等多種方式進行匹配,並且支持路由模塊化、多中間件等特性。
下面是Koa-router的基本用法:定義router、註冊中間件、監聽埠,接著就可以使用GET方法接受並響應客戶端的請求了。
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router();
router.get('/', (ctx, next) => {
console.log(123);
ctx.body = 'Hello Koa';
});
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000);
訪問localhost:3000即可在瀏覽器中看到輸出內容「Hello Koa」。
二、路由匹配
Koa-router支持四種類型的路由:GET、POST、PUT、DELETE。通過Koa-router暴露的對象router,可以使用對應的方法來註冊路由路徑。
GET路由
GET路由匹配的使用方式如下:
router.get('/', (ctx, next) => {
// ...
});
其中’/’代表匹配根路徑,也可以使用正則表達式來匹配更加複雜的路徑:
router.get(/^\/users\/(\d+)$/, (ctx, next) => {
// ...
});
上面的代碼使用正則表達式來匹配/users/1、/users/2等形式的路徑,同時參數可以通過解析正則表達式的結果來獲取。
POST路由
POST路由的使用方式和GET類似,只是將方法名改為post:
router.post('/', (ctx, next) => {
// ...
});
PUT路由
PUT路由的使用方式同樣和GET類似,將方法名改為put:
router.put('/', (ctx, next) => {
// ...
});
DELETE路由
DELETE路由的使用方式同PUT和POST也一樣,將方法名改為delete:
router.delete('/', (ctx, next) => {
// ...
});
三、路由參數
路由參數是指在路由路徑中,代表任意內容的變數,可以作為參數傳遞給路由回調函數。路由參數使用’:xxx’的形式進行定義,其中xxx為參數名,可以在回調函數中通過ctx.params.xxx獲取參數值。
router.get('/:category/:title', (ctx, next) => {
console.log(ctx.params);
// -> { category: 'tech', title: 'javascript' }
ctx.body = 'Hello ' + ctx.params.category + ':' + ctx.params.title;
});
上面的代碼定義了兩個參數category和title,通過在路徑中設置/tech/javascript的形式,可以將參數值傳遞給回調函數,最終輸出的響應內容為「Hello tech:javascript」。
四、中間件
Koa-router支持多中間件,在執行路由回調函數之前,可以通過註冊中間件來進行一些數據處理、許可權判斷等操作。中間件使用app.use()方法進行註冊,每個中間件都需要傳入一個ctx和next參數,其中ctx代表當前請求的上下文,next代表下一個中間件或者路由回調函數。
const logger = (ctx, next) => {
console.log(ctx.method, ctx.url);
next();
}
app.use(logger);
router.get('/', (ctx, next) => {
// ...
});
五、路由模塊化
隨著項目的增大,路由數量不斷增多,代碼可讀性和可維護性降低。因此,可以通過路由模塊化的方式,將不同的路由按照業務模塊分組,分別放置不同的文件當中,以實現代碼結構清晰、可讀性高。
路由模塊化的實現方式依賴於node.js的模塊載入機制,可以使用node.js的require()函數來實現不同文件之間的相互調用。如果你想將用戶路由放在routes/users.js文件中,並且在主程序中引入,那麼可以這樣寫:
const usersRouter = require('./routes/users')
app.use(usersRouter.routes());
其中,usersRouter是一個通過koa-router定義的路由對象。
六、總結
Koa-router是一個優秀的路由中間件,支持多種路由類型和不同的路由參數。同時,它還支持多中間件和路由模塊化,可以大大提高代碼的可維護性和可讀性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/151464.html