Node.jsを学ぶ(その9・Expressでアドレスに応じて処理を分ける)

  • 投稿日:
  • by
  • カテゴリ:

Expressでは、アクセスされたアドレスに応じて、処理を分けて出力することができます。
例として、「http://localhost:3000/entry/○○」のようなアドレスにアクセスされたときに、「○○」の値に応じて出力を分けることを取り上げます。

1.アドレスのパターンとルーターを対応付ける

アプリケーションを作った時点では、app.js内に以下のような部分があります。

app.get('/', routes.index);
app.get('/users', user.list);

この部分によって、「/」にアクセスされたときには、routesオブジェクトのindexメソッドが実行されます。
また、「/users」にアクセスされたときには、userオブジェクトのlistメソッドが実行されます。
この部分に記述を追加することで、他のアドレスへのアクセスも処理することができます。

今回のように、「/entry/○○」のアドレスをまとめて処理するには、以下のような文を追加して、「○○」の部分をパラメータに受け取るようにします。

app.get('/entry/:パラメータ名', ルーターのメソッド名);

ここでは、パラメータ名を「entry_id」にすることにします。
また、「entry」というルーターのオブジェクトを作って、その「show」というメソッドでページを表示することにします。
そこで、app.jsに以下の行を追加します。

app.get('/entry/:entry_id', entry.show);

2.ルーターの追加

次に、ルーターのオブジェクトを追加します。
アプリケーションのディレクトリにある「routes」ディレクトリに「entry.js」というファイルを作り、内容を以下のようにします。

exports.show = function(req, res){
  var 変数 = req.params.パラメータ名;
  ・
  ・(idに応じた処理)
  ・
  res.render('ビュー名', {
    変数: 値,
    変数: 値,
    ・・・
    変数: 値
  });
};

1行目の「exports」は、モジュール内のプロパティなどを、外部からアクセスできるようにするための構文です。
上の例だと、「exports.show = function・・・」としているので、外部からshowメソッドを呼び出すことができます。

2行目の「req.params.パラメータ名」は、app.jsの「app.get('/entry/:パラメータ名', ・・・);」が対応します。
アドレスの中のパラメータの部分を、「req.params.パラメータ名」で得ることができます。

作業1の中では、パラメータ名を「entry_id」にしていました。
したがって、以下の文を実行すれば、変数idにパラメータの値を得ることができます。

var id = req.params.entry_id;

後は、パラメータに応じた処理を行って、結果をビューに渡し、ページをレンダリングします。

3.app.jsにrequireの行を追加

最後に、app.jsの先頭にあるrequireの部分を以下のように書き換えて、entry.jsを読み込んでentryオブジェクトにアクセスできるようにします。

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , entry = require('./routes/entry')
  , http = require('http')
  , path = require('path');

なお、今日の話をベースに、後日に事例を紹介します。