koa學習之路二

1、Koa 路由npm

路由(Routing)是由一個 URI(或者叫路徑)和一個特定的 HTTP 方法(GET、POST 等)組成的,涉及到應用如何響應客戶端對某個網站節點的訪問。瀏覽器

通俗的講:路由就是根據不一樣的 URL 地址,加載不一樣的頁面實現不一樣的功能。app

Koa 中的路由和 Express 有所不一樣,在 Express 中直接引入 Express 就能夠配置路由,可是在 Koa 中咱們須要安裝對應的 koa-router 路由模塊來實現。koa

npm install koa-router --save

咱們接着上一節的項目目錄來編寫,將咱們的 app.js 文件改成以下:async

//引入 koa模塊
var Koa = require('koa');
var Router = require('koa-router');

//實例化
var app = new Koa();
var router = new Router();

//配置路由
router.get('/', async (ctx) => {
    // ctx  上下文 context ,包含了request 和response等信息
    // 返回數據    至關於:原生裏面的res.writeHead()  res.end()
    ctx.body = '首頁';
});
router.get('/news', async (ctx) => {
    ctx.body = "新聞頁面";
});

//啓動路由
app.use(router.routes());
app.use(router.allowedMethods());
/**
 router.allowedMethods()做用: 這是官方文檔的推薦用法,咱們能夠
 看到 router.allowedMethods()用在了路由匹配 router.routes()以後,因此在當全部
 路由中間件最後調用.此時根據 ctx.status 設置 response 響應頭
 能夠配置也能夠不配置,建議配置,
 */

app.listen(3000);

在上面的代碼中咱們引入了 koa-router 模塊來配置我麼們的路由,具體操做如上,咱們經過 router.get() 的方式定義了兩個路由地址 "/" 和 "/news",在調用路由的頁面分別返回不一樣的內容 ,最終結果以下:編輯器

當咱們在本地啓動項目後,在端口 3000 後輸入 "/",表示的依舊是該頁面,當咱們在端口後輸入 "/news" 時結果以下:網站

能夠看出不一樣的路由可以顯示不一樣的內容,說明咱們的路由已經配置好了。ui

可是在實際應用中咱們會看到瀏覽器的 url 地址是這樣的 http://localhost:3000/news?id=1&title=aaaurl

那咱們在後臺改如何接收到 ? 後面的傳值呢,以下代碼:spa

//引入 koa模塊
var Koa = require('koa');
var Router = require('koa-router');

//實例化
var app = new Koa();
var router = new Router();

//配置路由
router.get('/', async (ctx) => {
    // ctx  上下文 context ,包含了request 和response等信息
    // 返回數據    至關於:原生裏面的res.writeHead()  res.end()
    ctx.body = '首頁';
});
router.get('/news', async (ctx) => {
    /**
     在 koa2 中 GET 傳值經過 request 接收,可是接收的方法有兩種:query 和 querystring。
     query:返回的是格式化好的參數對象。
     querystring:返回的是請求字符串。
     */

    //從ctx中讀取get傳值
    console.log(ctx.url);   // /news?id=1&title=aaa
    console.log(ctx.query);  // { id: '1', title: 'aaa' } 獲取的是對象   用的最多的方式      ******推薦
    console.log(ctx.querystring);  // id=1&title=aaa      獲取的是一個字符串

    //ctx裏面的request裏面獲取get傳值
    console.log(ctx.request.url);   // /news?id=1&title=aaa
    console.log(ctx.request.query);   // { id: '1', title: 'aaa' } 對象
    console.log(ctx.request.querystring);   // id=1&title=aaa
    ctx.body = "新聞頁面";
});

//啓動路由
app.use(router.routes());
app.use(router.allowedMethods());
/**
 router.allowedMethods()做用: 這是官方文檔的推薦用法,咱們能夠
 看到 router.allowedMethods()用在了路由匹配 router.routes()以後,因此在當全部
 路由中間件最後調用.此時根據 ctx.status 設置 response 響應頭
 能夠配置也能夠不配置,建議配置,
 */

app.listen(3000);

咱們在 router.get("/news", ) 的路由中能夠經過 ctx. 來獲取咱們想要的 get 傳值,ctx 打印出來會有不少內容,在這裏咱們選了三個, url,query,querystring,另外在 ctx.request 中一樣包含這三個內容,輸出結果是同樣的。咱們建議 get 傳值的方式是 ctx.query 的形式。咱們來看一下結果:

咱們在瀏覽器中輸入如上地址,而後回車,咱們看一下編輯器的控制檯輸出日誌:

經過以上方法咱們就能獲取到咱們想要的 get 傳值數據了。

還有一種狀況咱們看到的並非上面的狀況,而是 http://localhost:3000/news/123

若是是上面的狀況,咱們須要在後臺這樣配置: router('/news/123', async () => {}) ,這樣顯然是可行的,可是若是 /news/ 後面跟的 123 多是別的內容,那咱們還須要再寫一個隨之對應的路由,這樣顯然是不可取的,這時候咱們就須要引入動態路由了,以下:

//引入 koa模塊
var Koa = require('koa');
var Router = require('koa-router');

//實例化
var app = new Koa();
var router = new Router();

//配置路由
router.get('/', async (ctx) => {
    // ctx  上下文 context ,包含了request 和response等信息
    // 返回數據    至關於:原生裏面的res.writeHead()  res.end()
    ctx.body = '首頁';
});
router.get('/news/:id', async (ctx) => {
    /**
     獲取動態路由傳參
     */

    //從ctx中讀取get傳值
    console.log(ctx.url);   // /news/123
    console.log(ctx.params);  // { id: '123' }
    ctx.body = "新聞頁面";
});

//啓動路由
app.use(router.routes());
app.use(router.allowedMethods());
/**
 router.allowedMethods()做用: 這是官方文檔的推薦用法,咱們能夠
 看到 router.allowedMethods()用在了路由匹配 router.routes()以後,因此在當全部
 路由中間件最後調用.此時根據 ctx.status 設置 response 響應頭
 能夠配置也能夠不配置,建議配置,
 */

app.listen(3000);

咱們將以前的 router.get('/news', ) 改成 router.get('/news/:id', ) 的形式,而後經過 ctx.params 就能獲取到咱們想要的 get 傳參,結果以下:

咱們在瀏覽器中輸入如上地址,而後回車,咱們看一下編輯器的控制檯輸出日誌:

經過以上方法咱們就能獲取到咱們想要的 get 傳值數據了。

相關文章
相關標籤/搜索