読者です 読者をやめる 読者になる 読者になる

フロントサイドエンジニアという選択肢

HTMLコーダー → ECサイト運営 → システムエンジニア という経歴の著者がフロントサイトエンジニアという職業に今後の活路を見出し、その道に進むために取得した技術を貯めておくブログ

(Node.js)Express appオブジェクト

Node.jsでExpressを使用する際、Express関数を実行すると、appオブジェクトが戻り値として返ってきます。appオブジェクトにコンフィグやルーティング等の様々な設定を行なって、最終的にcreateServerメソッドの引数として渡します。設定はusesetallgetpostなどのメソッドを使って行います。基本的な使用方法は以下のとおりです。

なお、appオブジェクトの詳しい使用はExpress公式ドキュメント(http://expressjs.com/api.html#appで確認できます

サイトのコンフィグを設定する

use

コンフィグ設定を行います。以下のサンプルはスケルトンで使われている基本的な機能です。

// ログを設定します。
var logger = require('morgan');
app.use(logger('dev'));

// POST送信情報を取得します。
// Express4ではextended:falseに設定するように推奨されています。
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

// クッキーを使用します
var cookieParser = require('cookie-parser');
app.use(cookieParser());

// CSS、js、画像等の静的ファイルの保管場所を設定します。
// この場合はルート直下のpublicフォルダを指定しています。
var path = require('path');
app.use(express.static(path.join(__dirname, 'public')));
set

appオブジェクトのプロパティを設定します。基本的にはデフォルトのままで大丈夫ですが、テンプレートなどを使用する場合には、プロパティに追加します。

// テンプレートファイルが格納されているフォルダ
app.set('views', path.join(__dirname, 'views'));

// テンプレートエンジンの指定
app.set('view engine', 'jade');

ルーティング処理を行う

ルーティング(アドレスバスによる処理の振り分け)は、all、get、postメソッドを使って行います。各メソッドの引数には、振り分けの条件と、条件が当てはまった時の処理を行うコールバック関数を渡します。コールバック関数の引数にはreq(リクエスト)メソッドres(レスポンス)メソッドnextメソッドが入ります。reqでリクエスト情報を受け取り、resにレスポンスの内容を設定します。すぐにレスポンスを返さず、次の判定に処理を渡す場合は、nextメソッドを使用します。
これらの処理はswitch文のようにソースの上から順に条件が当てはまるかチェックして、当てはまればその処理を行いレスポンスを返すので、一番最後に404(Not found)の処理を入れておくと、全てのアドレス間違いに対処できます。

all

全てのリクエストタイプに対して処理が行われます。通常は、全ページ共通の設定を行う場合などに使われるので、content-type等の設定に使えます。

app.all('*',function(req, res, next){
  res.type('html');
  next();
})
get

getメソッドは、リクエストがGET送信で行われた場合に呼ばれるメソッドです。パスの判定に使われるコロン「:」はプロパティの定義で、「:id」とした場合は、req.paramsオブジェクトの中にidプロパティが作成され、req.params.idといった形でコールバック関数の引数のreqから取得することができます。また、「?id=123」といったクエリ文字が送られてきた場合は、req.queryオブジェクトにプロパティとして設定されます。「?id=123」の場合は、req.query.idの値に123が入ります。

// サイトトップにアクセスした場合の処理
app.get('/', function(req, res, next) {
  res.send('<h1>WELCOME</h1><p>this is test page</p>');
});

// userディレクトリのトップにアクセスした場合の処理
// ユーザーデータをJSONで返す
app.get('/user', function(req, res, next){
  res.type('json');
  res.send({user:"aaa",infomation:{id:111,sex:"male"}});
})

// userディレクトリのidで振り分ける。
// idは数値のみ受け付けて、req.params.idで取得できる
app.get('/user/:id([0-9]+)',function(req, res, next){
  res.send('<h1>USER ID</h1><p>your id is ' + req.params.id + ' </p>');
})

// クエリの取得
// クエリはreq.queryで取得できる
app.get('/query/?', function(req, res, next){
  var query = '<h1>QUERY</h1>';
  for(var i in req.query){
    query += i + ':' + req.query[i] + '<br />';
  }
  res.send(query);
});

// 上記のいづれも当てはまらない場合は404エラー
app.get('*', function(req, res, next){
  res.status(404).send('page not found');
});;
post

POST送信が行われた場合は、postメソッドで処理を行うことができます。クライアント側からフォーム送信されたデータは、req.body内にinput nameの名前で入ってきます。

// クライアント側
<form action="/login">
    id:<input type="text" name="id">
    password:<input type="password" name="pass">
</form>

// Node.js側
app.post('/login', function(req, res, next){
  var id = req.body.id;
  var password = req.body.pass;
  // TODO:認証設定を行う
});