這次帶給大家,的注意事項有哪些,下面就是實戰案例,一起來看一下。
這次帶給大家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中文網其它相關文章!
推薦閱讀:
#以上是Egg.js裡如何取得HTTP參數的詳細內容。更多資訊請關注PHP中文網其他相關文章!