SummerWind

Web, Photography, Space Development

Expressのミドルウェアを使う

Node.jsを使っていて、Express (Connect)のミドルウェアを書いたりしたので、簡単にメモ。Expressのミドルウェアは、request / response / nextの3つの引数をとる関数を用意してやればよいです。3つ目のnextは関数で、実行すると次のミドルウェアが実行される仕組みになっています。なので、nextをせずにミドルウェアの実行を途中で止めることもできます。

今回は例として、reqに格納されるHTTPリクエストのCookieに user_id=summerwind といったような文字列が含まれていた場合、ユーザーID文字列、summerwind を抽出して、req.user_id に保存するミドルウェアモジュールを書いてみます。

function userid() {
   var pattern = new RegExp('user_id=([a-z\-])', 'i');
   return function(req, res, next) {
      if('cookie' in req.headers) {
         req.headers.cookie.match(pattern);
         req.user_id = RegExp.$1;
      }
      next();
   };
}

exports.userid = userid;

上記のモジュールを middleware.js として保存した場合、Expressでは以下のように使うことができます。

var express = require('express');
var middleware = require('./middleware');

var server = express.createServer();
server.configure(function() {
   // ミドルウェアを適用
   server.use(middleware.userid());
});

server.get('/', function(req, res) {
    res.send('User ID: '+req.user_id);
});

server.listen(8080);

セッションやログ管理など、アプリケーション全般で利用する共通処理なんかは、まとめてミドルウェアに落としてしまったほうが楽ですね。

Moto Ishizawa

Moto Ishizawa
ソフトウェアエンジニア。ロケットの打上げを見学するために、たびたびフロリダや種子島にでかけるなど、宇宙開発分野のファンでもある。