Node.js Tips : BodyParserが少しだけ便利になったとの事

JavaScript

2018年に出版されているNode.jsに関する書籍に紹介されていたBodyParserの使い方が少し古い情報だったので、2021年1月時点の情報を掲載しようと思います。
もう一つ、bodyParserの宣言の方法が1つしか紹介されていなかったので、改めて別の方法を紹介します。

※書籍の紹介はページ最後にあります。

body-parserとは

まず、body-parserとは何かということですが、HTTPというプロトコルに関する少し詳細な知識がない人には難しいかもしれません。

ブラウザなどのクライアントからサーバーに対して処理のリクエストを行う際に、一緒に送信するデータ、もしくはクライアントからのリクエストの応答としてサーバーからクライアントへ返信するデータのことをメッセージボディ(Message body)といいます。
body-parserは、このメッセージボディを解析してプログラムで参照しやすいオブジェクトに変換してくれるライブラリです。

一番わかり易いのはPOSTメソッドを使ったフォーム情報の送信時です。
ユーザーがブラウザに表示された入力フォームにデータを入力し、「送信」をクリックしたときにPOSTメソッドでフォームデータをサーバーに送信しますが、そのときにブラウザは入力されたデータをPOSTメソッドのメッセージボディにセットして、HTTPヘッダーに必要な情報(メッセージボディの文字数や文字コード等)を一緒にセットしてサーバーに送信します。
サーバーは、受け取った情報からメッセージボディを特定し、HTTPヘッダーに指定された情報をもとに復元してサーバー側で処理します。

WEBサーバーとしては、この処理は定形処理といっていいぐらい、どのようなアプリケーションでも必要となることが予想される処理で、毎回個別にプログラムを書くのはあまりにも無駄なので、body-parserという拡張モジュールが担ってくれるということです。

今回POSTメソッドについて言及しましたが、HTTPプロトコル(rfc2616)では、メッセージボディをセットできるメソッドについては特に言及していないため、POST以外のメソッド(例えばGETメソッド)でもメッセージボディをセットすることはできます。
ですが、ブラウザからGETメソッドでリクエストを送信する場合、通常はメッセージボディではなくHTTPパラメータとして設定されます。
このため、サーバー側の処理としてGETメソッドの処理ではメッセージボディに何かデータが設定されてくるということは一般的には期待しません。

不要となったrequire宣言

私が参照した書籍は2018年に出版されたものです。
当時の情報として”body-parser”はNode.jsの拡張モジュールとして利用することが前提だったようです。
2021年1月時点のExpressでは、body-parserが標準モジュールとして同梱されており、require宣言が不要となりました。

例えば、書籍ではPOSTメソッドを処理するときには、以下のようにbody-parserをnpmでインストールし、かつプログラムではrequire宣言を行っていました。

$> npm install --save body-parser
var express = require('express');
var app = express();
var bodyParser = require('body-parser'); // ←ここ
app.use(bodyParser.urlEncoded({extended: false}));

app.post('/', (req, res,) => {
    // POST処理
}); 

ですが、2021年1月時点のLTSバージョン(v14.15.1)では、npmインストールが不要となり、expressオブジェクトから参照できるようになったのでrequireによるオブジェクトの生成も不要となりました。

var express = require('express');
var app = express();
app.use(express.urlEncoded({extended: false}));

app.post('/', (req, res,) => {
    // POST処理
}); 

元々HTTPサーバーのフレームワークであるExpressにBodyParserが無かったのが不思議なぐらい、メッセージボディの解析処理はサーバー側の処理としては頻繁に利用する一般的な処理なので、標準として取り込まれたのは至極当然だと思います。

補足:urlEncodedの設定タイミング

もう一つ、書籍では記載されていなかったurlEncodedの宣言のタイミングについて補足します。

書籍ではapp.use()にてurlEncodedが宣言されています。

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlEncoded({extended: false})); // ←ここ

app.post('/', (req, res,) => {
    // POST処理
}); 

書籍ではこの宣言の仕方について言及されていなかったのですが、この宣言方法は、サーバーで処理するすべてのリクエストでurlEncodedを使用する場合にこのように宣言します。
おそらく、通常はこのような宣言で問題ないと思います。

ただ、別の方法の宣言も可能らしいので、適材適所、必要に応じて使い分けれるということを補足したかったのでここで紹介します。

それはメソッド単位に指定する方法です。

var express = require('express');
var app = express();

// ↓POST処理で直接宣言することもできる
app.post('/', express.urlEncoded({extended: false}), (req, res,) => {
    // POST処理
}); 

こうすることで、メソッド単位に、例えば、”/”へのPOSTはurlEncoded、”/api”へのPOSTはjson等と使い分けることができるようになります。
このような使い分けをするかどうかは別として、このような使い方もあるということで紹介させていただきました。

今回の参考書籍

今回参考にさせて頂いたのは「Node.js超入門」という書籍です。
JavaScriptの基本をしっかり紹介しつつ、Node.jsというランタイムでのプログラム実行方法、プログラム開発ツールやライブラリの使い方、データ処理、API連携について初心者向けにわかりやすく言及し、最後には少し本格的なアプリも開発できてしまうという素晴らしい書籍でした。
ページ数という書籍ならではの制限がありつつもここまで簡易に説明仕切っている本は中々ありません。


JavaScriptの基本から丁寧に解説してくれています。読了する頃には簡単なWEBアプリが作成できるようになっており、難易度の高い情報にアクセスしても理解できるぐらいのスキルが身についていると思います。

コメント

タイトルとURLをコピーしました