EJSテンプレートエンジンの使い方メモ5 ルーティング定義


node01

こんにちは。さがっとです!

WEBアプリを作成できる。
を目標にnode.jsについて学習したことをメモしていきたいと思います。

2016/02/25学習分です。ブログメモが学習に追いつかない!

やりたい事

ブラウザからのリクエストに応じてどのページを表示するかをEJSテンプレートエンジンを使ってコントロールする。

 

例えは、以下のような構成の場合、

ejs_route

http://localhost:3000/か、http://localhost:3000/indexにアクセスしたら、content.ejsの内容が表示される。

http://localhost:3000/otherにアクセスしたら、other.ejsの内容が表示される。

上記以外のアドレス(存在しないURL)にアクセスがあったら、404.ejsを表示させる。

と、いった具合です。

前回まで同様、index.ejsが全体表示のテンプレートファイル、serverapp.jsがスクリプトファイルです。(詳しくは3回目メモにて記載)

各テンプレートファイル

まず、各テンプレートファイルを用意します。

index.ejs(全体表示のテンプレート)

★<%-content %>に各ejsの中身を書き出す。

content.ejs(”/”か、”/index”にアクセスがあった時用)

other pageへをクリックすると、/otherへアクセスする。

other.ejs(”/other”にアクセスがあった時使用)

戻るをクリックすると/へアクセスする。

404.ejs(存在しないページにアクセスがあった時使用)

スクリプトファイル

serverapp.js

★1 urlオブジェクトの取得

URLを扱うため、「url」というオブジェクトを取得しておく。

urlオブジェクトは、クライアントがアクセスした際のURL情報を管理することができる。

★2 各ページのデータを準備

pagedataという変数に各ejs向けデータを格納する。

  • キー:アクセスされたパス
  • 値:各パスで表示されるページの情報を連想配列でまとめたもの

★3 リクエストされたURLをオブジェクトに格納

まずは、URLの文字列をパースする。

parseメソッドは引数のURL文字列を解析し、様々な要素に分解したオブジェクトを生成することが出来る。

今回は、以下のように

変数urlinfoにURLの各要素がオブジェクトとして格納したが、この中で「パス」の値は「pathname」というプロパティとして保管されている。

 

★4 パスの値を取得し、準備しておいたpagedataから表示するページデータをゲットする

★2で準備しておいたpagedataには、アクセスされたパスごとで必要となる情報が、値に連想配列にまとめられているので、pagedata[urlinfo.pathname]の値を取り出せば、現在アクセスしているパスに紐づく情報が取り出せることになる。

もし、pagedata[urlinfo.pathname] = nullならば、pagedataには情報がない。ということになるので、必ずpagedata[“/notfound”]の値をとりだすようにしておけば404.ejs向けのデータを取得することができる。

 

★5 ゲットしたページのレンダリング

★4で取り出したデータを利用して、表示するejsのレンダリングを行う。

displaydata.contentに、★7で読み込みこんでおいたテンプレートの変数名が格納されているのがミソ。

★6 全体表示のテンプレート(index)内に、コンテンツ(contentdata)をはめこむ

前回まで同様、全体表示のテンプレート(index)内に、コンテンツ(contentdata)をはめこむ。

動かしてみる

コマンドプロンプトでスクリプトファイルを起動。

http://localhost:3000へアクセス。

ejs_index

でた!

続けて、「othet pageへ」をクリックして、localhost:300/otherへアクセス

ejs_other

続けて、http://localhost:3000/indexにもアクセス

ejs_index

http://localhost:3000と同じ画面が表示されます。

続けて存在しないアドレスhttp://localhost:3000/AAAAAへアクセス

ejs_404

404エラーページへ飛ぶ。

 

自分でルーティング定義しなきゃいけないのは大変だなぁ。

あと、

http://localhost:3000/indexは正常にアクセスできても、

http://localhost:3000/index/と、「/」を末尾につけた場合も404ページに行ってしまうので、そこの制御もしてあげないといけないのかな?結構大変。

ejs_404_2

この記事がお役に立てたら、是非シェアをお願いします^^