はじめに
この短い記事では Express.js で POST ボディから情報を抽出する方法について説明します。 HTTP プロトコルでは、クライアントからサーバーに情報を渡す方法がいくつか用意されており、POST ボディは HTTP でデータを送信するための最も柔軟で最も一般的な方法です。
この記事では、Node.js とシンプルな Express.js サーバーを作成した経験があると仮定します。
Sending POST Data in HTTP
データは多くの理由で HTTP POST 呼び出しにより送信できます。最もよくあるのは HTML <form>
または API 要求を介してです。
-
application/x-www-form-urlencoded
のように、データはいくつかの異なる形式を取ることができます。 このエンコーディングのデータは、URL で見られるようなクエリ文字列のようにフォーマットされ、キーと値のパリは&
foo=bar&abc=123&stack=abuse
のようになります。 これはデフォルトのエンコーディングです。 -
multipart/form-data
: このエンコーディングは、通常、ファイルを送信するために使用されます。 要するに、各 key-value は同じリクエストで送信されますが、異なる「パート」が「境界」で区切られ、より多くのメタデータを含みます。 -
text/plain
: このデータは構造化されていないプレーンテキストとして送信され、通常は使用されません。
生の HTTP POST 要求で application/x-www-form-urlencoded
エンコードを使用すると、次のようになります。
POST /signup HTTP/1.1Host: example.comContent-Type: application/x-www-form-urlencodedContent-Length: 53username=scott&password=secret&website=stackabuse.com
POST データの抽出
POST データにすぐにアクセスする前に、Express アプリケーションを適切に構成する必要があります。 すべての Web アプリ サーバーでボディ解析が必要なわけではなく、どのようなボディ解析が有効かはアプリケーションによって異なるため、この設定を行う必要があります。
これを設定するために、多くの形式のデータを処理できる body-parser パッケージを使用することになります。
// index.jsconst express = require('express');const bodyParser = require('body-parser');const app = express();app.use(bodyParser.urlencoded({ extended: true }));app.post('/post-test', (req, res) => { console.log('Got body:', req.body); res.sendStatus(200);});app.listen(8080, () => console.log(`Started server at http://localhost:8080!`));
ルートを定義する前に app.use(...)
body-parser
がルートの前に実行され、ルートが解析された HTTP POST ボディにアクセスできることが保証されます。
これをテストするために、まず Express アプリを起動し、別のコンソール ウィンドウで curl
ユーティリティを使用します。
$ curl -d "username=scott&password=secret&website=stackabuse.com" -X POST http://localhost:8080/post-testOK
$ node index.jsStarted server at http://localhost:8080!Got body: { username: 'scott', password: 'secret', website: 'stackabuse.com' }
ここで、クエリ文字列データは JavaScript オブジェクトに解析されたことがわかり、簡単にアクセスできることが確認されます。
Another important thing to note is our use of the extended
option when calling bodyParser.urlencoded
. Using the extended
option tells body-parser
to use the qs
library to parse the URL-encoded data. This allows for things like objects and arrays to be encoded into the URL-encoded format.
And while urlencoded
is one of the most commonly used parsers that body-parser
provides, you can also use the following:
-
.json()
: Parses JSON-formatted text for bodies with aContent-Type
ofapplication/json
. -
.raw()
: Parses HTTP body in to aBuffer
for specified customContent-Type
s, although the default acceptedContent-Type
isapplication/octet-stream
. -
.text()
: HTTP のボディをContent-Type
で解析し、プレーンな文字列として返します。
これらのパーサーはそれぞれ、gzip または deflate でエンコードしたデータの自動インフレーションもサポートしているので、アプリケーション コードで余計な作業をしなくても透過的に圧縮が使用できるようになっています。
ミドルウェア モデルとこのパッケージがデータを解析する方法について素晴らしいことは、1 つのパーサーだけを使用することに縛られないということです。
// index.jsconst express = require('express');const bodyParser = require('body-parser');const app = express();app.use(bodyParser.urlencoded({ extended: true }));app.use(bodyParser.json());app.use(bodyParser.raw());// ...
では、本文が JSON の HTTP POST 要求を送信すると、req.body
プロパティの通常の JSON オブジェクトに解析されるようになりました。
POST /post-test HTTP/1.1Host: localhost:8080Content-Type: application/jsonContent-Length: 69'{"username":"scott","password":"secret","website":"stackabuse.com"}'
$ node index.jsStarted server at http://localhost:8080!Got body: { username: 'scott', password: 'secret', website: 'stackabuse.com' }
まとめ
多様で大量のデータを HTTP で送信する最も一般的な方法は、POST メソッドを使用することです。 Express のサーバー側でこのデータに簡単にアクセスする前に、body-parser
パッケージなどのミドルウェアを使用して、データを簡単にアクセスできる形式にパースする必要があります。 生の HTTP リクエストからのデータが解析されると、body
req
プロパティを介してアクセスすることができるようになります。