序章

requestの略で、reqオブジェクトは、requestおよびresponseサイクルの半分であり、クライアント側からの呼び出しを調べ、HTTP要求を行います。文字列またはJSONオブジェクトのいずれかで受信データを処理します。

この記事では、Expressのreqオブジェクトについて学習します。

前提条件

この記事をフォローするには、次のものが必要です。

  • Node.jsの一般的な理解が推奨されますが、必須ではありません。 Node.jsの詳細については、Node.jsシリーズのコーディング方法をご覧ください。
  • HTTPリクエストの一般的な知識。

クライアント側のデータの管理

Expressサーバーは、req.paramsreq.query、およびreq.bodyオブジェクトの3つのインスタンスで、reqオブジェクトを介してクライアント側からデータを受信します。

req.paramsオブジェクトは、URLで指定されたパラメーターに基づいてデータをキャプチャします。 index.jsファイルで、'/:userid'のパラメーターを使用してGETリクエストを実装します。

index.js
// GET https://example.com/user/1

app.get('/:userid', (req, res) => {
  console.log(req.params.userid) // "1"
})

req.paramsオブジェクトは、パラメーター'/:userid'を介してユーザーのIDの結果を出力するようにExpressに指示します。 ここで、指定されたパラメーターを使用したhttps://example.com/user/1へのGET要求は、"1"のIDでコンソールにログインします。

URLクエリ文字列にアクセスするには、req.queryオブジェクトを適用して、データの検索、フィルタリング、および並べ替えを行います。 index.jsファイルに、ルート'/search'へのGETリクエストを含めます。

index.js
// GET https://example.com/search?keyword=great-white

app.get('/search', (req, res) => {
  console.log(req.query.keyword) // "great-white"
})

req.queryオブジェクトを利用すると、条件付きクエリでクライアント側からロードされたデータと一致します。 この場合、'/search'ルートへのGET要求は、検索クエリのキーワードをhttps://example.comに一致させるようにExpressに通知します。 .keywordプロパティをreq.queryオブジェクトに追加した結果は、コンソール"great-white"にログインします。

req.bodyオブジェクトを使用すると、クライアント側から文字列またはJSONオブジェクトのデータにアクセスできます。 通常、req.bodyオブジェクトを使用して、ExpressサーバーのPOSTおよびPUT要求を介してデータを受信します。

index.jsファイルで、POSTリクエストをルート'/login'に設定します。

// POST https://example.com/login
//
//      {
//        "email": "[email protected]",
//        "password": "helloworld"
//      }

app.post('/login', (req, res) => {
  console.log(req.body.email) // "[email protected]"
  console.log(req.body.password) // "helloworld"
})

ユーザーがクライアント側で電子メールとパスワードを入力すると、req.bodyオブジェクトはその情報を保存し、Expressサーバーに送信します。 req.bodyオブジェクトをコンソールにログインすると、ユーザーの電子メールとパスワードが表示されます。

reqオブジェクトを実装する方法を検討したので、Expressサーバーに統合する他のアプローチを見てみましょう。

reqプロパティを使用したURLの調査

reqオブジェクトのプロパティは、構造に基づいてURLの一部を返すこともできます。 これには、protocolhostnamepathoriginalUrl、およびsubdomainsが含まれます。

index.jsファイルで、GETリクエストを'/creatures'ルートに設定します。

index.js
// https://ocean.example.com/creatures?filter=sharks

app.get('/creatures', (req, res) => {
  console.log(req.protocol)     // "https"
  console.log(req.hostname)     // "example.com"
  console.log(req.path)         // "/creatures"
  console.log(req.originalUrl)  // "/creatures?filter=sharks"
  console.log(req.subdomains)   // "['ocean']"
})

.protocol.hostnameなどの組み込みプロパティを使用して、URLのさまざまな部分にアクセスできます。 reqオブジェクトを各プロパティとともにログに記録すると、URLの構造がわかります。

追加のreqプロパティの分析

resオブジェクトは、HTTPリクエストへの呼び出しを最大化するためのプロパティで構成されています。

GETPOSTPUTDELETEのいずれであっても、HTTPメソッドにアクセスするには、.methodプロパティをreqオブジェクト。 index.jsファイルで、匿名エンドポイントへのDELETEリクエストを実装します。

index.js
app.delete('/', (req, res) => {
  console.log(req.method) // "DELETE"
})

.methodプロパティは、現在のHTTPリクエストメソッドを返します。 この場合、コンソールはDELETEメソッドをログに記録します。

サーバーに送信されるヘッダーの場合は、メソッド.header()reqオブジェクトに追加します。 POSTリクエストをindex.jsファイルのルート'/login'に設定します。

index.js
app.post('/login', (req, res) => {
  req.header('Content-Type')  // "application/json"
  req.header('user-agent')    // "Mozilla/5.0 (Macintosh Intel Mac OS X 10_8_5) AppleWebKi..."
  req.header('Authorization') // "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
})

req.header()メソッドは、Content-TypeAuthorizationなどのヘッダータイプを返します。 req.header()の引数では大文字と小文字が区別されないため、req.header('Content-Type')req.header('content-type')を同じ意味で使用できます。

Expressサーバーの依存関係としてcookie-parserを追加した場合、req.cookiesプロパティはパーサーからの値を格納します。 index.jsファイルで、req.cookiesのインスタンスを設定し、sessionDateプロパティを適用します。

index.js
// Cookie sessionDate=2019-05-28T01:49:11.968Z

req.cookies.sessionDate // "2019-05-28T01:49:11.968Z"

reqオブジェクトから呼び出されたときに、Cookieのセッション日付から返される結果に注意してください。

結論

Expressは、reqオブジェクトをrequestサイクルの一部として利用して、クライアント側からのHTTP要求とデータを処理するための組み込みプロパティを提供します。 reqの公式ドキュメントを表示する場合は、公式Express.jsドキュメントにアクセスしてください。