Egg中擷取路由傳參與Koa差不多,主要的差別在于Egg中的控制器繼承于Controller,是以在擷取傳參的時候要修改 this 的指向,下面用一個執行個體來說明如何擷取路由傳參。
首先在app檔案夾下的 router.js 中添加路由。
'use strict';
module.exports = app => {
const { router, controller } = app;
// 配置靜态路由,指向controller檔案夾下news.js檔案裡的index方法
router.get('/news', controller.news.index);
// 配置動态路由,指向controller檔案夾下的news.js檔案裡的detail方法
router.get('/detail/:id', controller.news.detail);
};
複制
然後在 controller 中建立路由所對應的控制器檔案 news.js,并在檔案中添加路由所對應的方法 index 與 detail。
'use strict';
const Controller = require('egg').Controller;
class NewsController extends Controller {
async index() {
this.ctx.body = '新聞首頁';
// Koa中擷取get傳值 ctx.query
// Egg中擷取get傳值 this.ctx.query
// 在浏覽器中輸入 http://127.0.0.1:7001/news?page=1
var query = this.ctx.query;
// 列印擷取的路由參數
console.log(query);
// { page: '1' }
}
async detail() {
this.ctx.body = '新聞詳情';
// Koa中擷取動态路由傳值 ctx.params
// Egg中擷取動态路由傳值 this.ctx.params
// 在浏覽器中輸入 http://127.0.0.1:7001/detail/123
var params = this.ctx.params;
// 列印擷取的路由參數
console.log(params);
// { id: '123' }
}
}
module.exports = NewsController;
複制
以上就是在 Egg 中擷取路由傳參的方法,分别是 this.ctx.query 和 this.ctx.params。
有一個小技巧,值得提一下,如果安裝了 vscode-eggjs 這個插件,當在控制器檔案中輸入 egg 後會出現 egg controller 這個提示選項,選擇确認該選項,就會自動生成與控制器檔案名相關聯的繼承控制器,這樣一來,就省去了我們給控制器命名的煩惱。
參考:
https://eggjs.org/zh-cn/basics/router.html
https://eggjs.org/zh-cn/basics/controller.html