Node.js | 複数ページのルーティングとフォームのPOST送信

Node.jsで複数ページをルーティングする方法と、HTMLフォームからPOST送信された値を受け取る方法を説明する。

複数ページのルーティング

Node.jsアプリケーションで複数のページを扱う場合は、リクエストURLを解析し、表示するテンプレートへ対応付ける。共通レイアウトはtemplate.ejsに置き、各ページの本文はcontent1.ejscontent2.ejsのように分けておく。

基本の流れは、ルート表を用意し、url.parseでリクエストURLを解析して、その表からテンプレートを選ぶことになる。一致するルートがなければ404を返す。

var routes = {
  "/": "content1.ejs",
  "/content2": "content2.ejs"
};

var url_parts = url.parse(request.url);
var target = routes[url_parts.pathname];

ページ本文はfs.readFileで読み込み、EJSでレンダリングして共通テンプレートへ差し込む。これにより、複数ページで同じページ枠を共有しながら、本文だけを個別に管理できる。

フォームをPOSTで送信する

フォームの値を送信するには、content1.ejsにフォームを作成し、method="post"と受信先のactionを指定する。

<form method="post" action="/content3">
  <input type="text" name="idname">
  <input type="password" name="pass">
  <input type="submit">
</form>

送信先のページはcontent3.ejsなどの別テンプレートとして用意し、受け取った値を表示する。

<p>ID: <%= idname %></p>
<p>PASS: <%= pass %></p>

Node.jsではPOSTデータは分割して届くため、dataイベントで本文を集め、endイベントでquerystring.parseを使って解析する。

request.on("data", function(chunk) {
  body += chunk;
});

request.on("end", function() {
  var data = qs.parse(body);
  render(data);
});

GETアクセスとPOST送信は分けて処理する。GETではフォームを表示し、POSTではリクエスト本文を読み取って、送信された値を使って結果ページを描画する。この形が、Expressを使わない簡単な複数ページNode.jsアプリケーションの基本になる。