2013-05-07

Node.js (express)で使うConnectみたいに使えるミドルウェアをつくる (UserAgent編)



express使ってて、Connectに代表されるbodyParser, session, cookiePerser, compress, errorHandlerみたいな、全ルート処理に対するfilterみたいな実装がしたくてメモ。
具体的に言うとuserAgent判別とか。

※あくまでやり方のメモ!実際の実装ではもっとちゃんとuseragent判定等を書く必要があります。

Connectって?


connect
https://github.com/senchalabs/connect

上記に書いたようなhttpServerの機能をexpressに提供してくれてるライブラリという認識。ひと通りnode.js入門してからgithub読めば大体分かる。readmeにMiddlewareに各種機能とその説明、ソースがある。

※参考
http://d.hatena.ne.jp/hokaccha/20110719/1311053590
hokaccha氏の読んでみた記事



何したいの?

express入門でおまじないのように書いてるapp.configure()内のapp.use()で使えるミドルウェアを自作します。

var express = require('express');
var app = express();
app.configure(function(){
app.use(express.bodyParser()); // 的な
app.use("ここで使えるミドルウェアを作る");
});


実装

使い方と作り方。使う方は適当です。

使う方


var express = require('express');
var userAgent = require('userAgent');
var app = express();
app.configure(function(){
app.use(userAgent({options: 'something'})); // 各種設定等を引数として渡せる
});

ミドルウェア(userAgent.js)


module.exports = function(options) {
// 超適当なuserAgentチェックでiPhoneかどうかチェック
function isIphone(userAgent){
if(userAgent.indexOf('iPhone') >= 0) {
return true;
}else{
return false;
}
}
// middlewareの実装
return function(req, res, next) {
var userAgent = req.headers['user-agent'];
if(isIphone(userAgent)){
next(); // iPhoneからのアクセスを次のミドルウェア呼び出しに渡す
}else{
// iPhone以外はとりあえずサポート対象外ということにしてリダイレクト
res.statusCode = 302;
res.setHeader('Location', 'http://errorpage/unsupported');
return res.end();
}
}
}
実際の処理はreturn function(req, res, next)辺りから始まって、next()を実行することで次のapp.use()のルート処理にexpressが引き継いでくれてる。

適当すぎて申し訳ないのだけど、ここではiPhone以外のUserAgentが来た時は302にstatusを変えてヘッダ変更後、next()しないでres.end()することでredirectしました。



0 件のコメント: