ホームページ  >  記事  >  ウェブフロントエンド  >  Egg.jsでHTTPパラメータを取得する方法

Egg.jsでHTTPパラメータを取得する方法

php中世界最好的语言
php中世界最好的语言オリジナル
2018-03-24 09:16:444611ブラウズ

今回はnotesとは何かを紹介します。実際の事例を見てみましょう。

今回は、Egg.jsでHTTPパラメータを取得する方法と、Egg.jsでHTTPパラメータを取得する際の注意点について説明します。以下は実践的なケースですので、見てみましょう。

Egg.js フレームワークでは、基本的にコントローラーがビジネス開発において HTTP プロトコルと対話する唯一の場所であるため、フレームワークはユーザーが送信したものを取得するために、コントローラーにバインドされた Context インスタンスを通じて多くの便利なメソッドとプロパティを提供します。 HTTP リクエストにパラメータが渡されました。この記事では、http リクエストのパラメータを取得する方法をまとめます。

1.query

URL 内の次の部分は、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;
};

クエリ文字列内のキーが繰り返される場合、context.query は、キーが初めて出現したときのみ、およびその後のすべての出現時に値を取得します。無視されます。 GET /posts?category=egg&category=koa context.query で取得した値は { category: 'egg' } です。

1.1 クエリ

システムは、GET /posts?category=egg&id=1&id=2&id=3 など、ユーザーが同じキーを渡せるように設計されている場合があります。このような状況に備えて、フレームワークは context.queries オブジェクトを提供します。これはクエリ文字列も解析しますが、重複データは破棄せず、すべてを配列に入れます:

// 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 すべてのキーに値がある場合、それらは配列型である必要があります。

2. ルーターのパラメーター

パラメーターはルーターでも宣言でき、これらのパラメーターは 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 を介して機密データを渡すことは安全ではありません。

ヘッダーの後にボディ部分があることがわかっており、通常はこの部分で POST、PUT、DELETE などのメソッドのパラメーターを渡します。一般に、リクエストに本文がある場合、クライアント (ブラウザ) は Content-Type も送信して、このリクエストの本文がどのような形式であるかをサーバーに伝えます。 Web 開発におけるデータ転送で最も一般的に使用される 2 つの形式は、JSON とフォームです。

フレームワークには、これら 2 種類の形式のリクエスト本文を object に解析し、context.request.body にマウントする組み込みの bodyParser ミドルウェア があります。 HTTP プロトコルでは GET メソッドや HEAD メソッドでアクセスする際にボディを渡すことが推奨されていないため、この方法では 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 形式に従って解析され、本文の最大長は 100kb に制限されます。

リクエストのContent-Typeがapplication/x-www-form-urlencodedの場合、リクエストボディはフォーム形式に従って解析され、ボディの最大長は100kbに​​制限されます。

解析が成功すると、body は間違いなく Object (おそらく配列) になります。

一般的に、最も頻繁に調整される設定項目は、解析中に許可される最大長を変更することです。config/config.default.js でフレームワークのデフォルト値をオーバーライドできます

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

ユーザーのリクエスト本文が解析を超える場合は、設定された最大長により、ステータス コード 413 の例外がスローされます。ユーザーが要求した本文が解析に失敗した場合 (間違った JSON)、ステータス コード 400 の例外がスローされます。

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

Mysqld_multi デプロイメント スタンドアロンの詳細な説明

1 つの SQL ステートメントで異なるデータベースにクエリを実行する方法

JS は選択ドロップダウン ボックスの最初の要素の値を取得します

以上がEgg.jsでHTTPパラメータを取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。