首頁  >  文章  >  web前端  >  Egg.js裡如何取得HTTP參數

Egg.js裡如何取得HTTP參數

php中世界最好的语言
php中世界最好的语言原創
2018-03-24 09:16:444610瀏覽

這次帶給大家,的注意事項有哪些,下面就是實戰案例,一起來看一下。

這次帶給大家Egg.js裡如何取得HTTP參數,Egg.js裡取得HTTP參數的注意事項有哪些,以下就是實戰案例,一起來看一下。

在Egg.js框架中,由於Controller基本上是業務開發中唯一和HTTP 協定打交道的地方,所以框架透過在Controller上綁定的Context實例,提供了許多便捷方法和屬性來獲取用戶透過HTTP請求發送過來的參數。本文就總結一下取得http請求的參數方法:

1.query

在URL 中?後面的部分是一個Query String,這一部分常用於GET 類型的請求中傳遞參數。例如 GET /search?name=egg&age=26中 name=egg&age=26 就是使用者傳遞過來的參數。我們可以透過context.query(為物件)拿到解析後的這個參數體

module.exports = app => {  class SearchController extends app.Controller {
    * search() {      const queryObj = this.ctx.query;      console.log(queryObj.age);      console.log(queryObj);      //打印结果:{ name: 'egg', age: '26' }
    }
  }  return SearchController;
};

當Query String 中的key 重複時,context.query只取key 第一次出現時的值,後面再出現的都會被忽略。 GET /posts?category=egg&category=koa 透過 context.query拿到的值是 { category: 'egg' }。

1.1   queries

有時候我們的系統會設計成讓使用者傳遞相同的 key,例如 GET /posts?category=egg&id=1&id=2&id=3。針對此類情況,框架提供了context.queries 對象,這個對像也解析了Query String,但是它不會丟棄任何一個重複的數據,而是將他們都放到一個數組中:

// GET /posts?category=egg&id=1&id=2&id=3const Controller = require('egg').Controller;module.exports = class PostController extends Controller {
  * listPosts() {    console.log(this.ctx.queries);    //result:
    // {
    //   category: [ 'egg' ],
    //   id: [ '1', '2', '3' ],
    // }
  }
};

context.queries上所有的key 如果有值,也一定會是數組類型。

2. Router params

我們知道在 Router 上也可以申明參數,這些參數都可以透過 context.params取得。

// app.get('/projects/:projectId/app/:appId', 'app.listApp');// GET /projects/1/app/2const Controller = require('egg').Controller;module.exports = class AppController extends Controller {
    * listApp() {    assert.equal(this.ctx.params.projectId, '1');    assert.equal(this.ctx.params.appId, '2');
  }
};

3. body

雖然我們可以透過URL 傳遞參數,但還是有諸多限制:

瀏覽器中會對URL 的長度有所限制,如果需要傳遞的參數過多就會無法傳遞。

服務端經常會將存取的完整 URL 記錄到日誌檔案中,有一些敏感資料透過 URL 傳遞會不安全。

我們知道在 header之後還有一個 body部分,我們通常會在這個部分傳遞 POST、PUT 和 DELETE 等方法的參數。一般請求中有 body的時候,客戶端(瀏覽器)會同時發送 Content-Type告訴服務端這次請求的 body 是什麼格式的。 Web 開發中資料傳遞最常用的兩類格式分別是 JSON和 Form。

框架內建了 bodyParser 中介軟體來對這兩類格式的請求 body 解析成 object 掛載到 context.request.body上。 HTTP協定中並不建議在透過 GET、HEAD 方法存取時傳遞 body,所以我們無法在 GET、HEAD 方法中依照此方法取得內容。

// POST /api/posts HTTP/1.1// Host: localhost:3000// Content-Type: application/json; charset=UTF-8//// {"title": "controller", "content": "what is controller"}const Controller = require('egg').Controller;module.exports = class PostController extends Controller {
  * listPosts() {    assert.equal(this.ctx.request.body.title, 'controller');    assert.equal(this.ctx.request.body.content, 'what is controller');
  }
};

框架對bodyParser 設定了一些預設參數,配置好之後擁有以下特性:

當請求的Content-Type 為application/json,application/json-patch+json,application/ vnd.api+json 和application/csp-report 時,會依照json格式對請求body 進行解析,並限制body 最大長度為100kb。

當請求的 Content-Type 為 application/x-www-form-urlencoded 時,會依照 form 格式對請求 body 解析,並限制 body 最大長度為 100kb。

如果解析成功,body 一定會是一個 Object(可能是一個陣列)。

一般來說我們最常調整的設定項就是變更解析時允許的最大長度,可以在config/config.default.js中覆寫框架的預設值

module.exports = {
  bodyParser: {
    jsonLimit: '1mb',
    formLimit: '1mb',
  },
};

如果使用者的請求body 超過了我們配置的解析最大長度,會拋出一個狀態碼為413 的異常,如果用戶請求的body 解析失敗(錯誤的JSON),會拋出一個狀態碼為400的異常。

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

mysqld_multi部署單機詳解

怎麼用一個SQL語句查詢不同的資料庫

#JS取得select下拉方塊中第一順位元素內的值

#

以上是Egg.js裡如何取得HTTP參數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn