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()で使えるミドルウェアを自作します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var express = require('express'); | |
var app = express(); | |
app.configure(function(){ | |
app.use(express.bodyParser()); // 的な | |
app.use("ここで使えるミドルウェアを作る"); | |
}); |
実装
使い方と作り方。使う方は適当です。
使う方
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var express = require('express'); | |
var userAgent = require('userAgent'); | |
var app = express(); | |
app.configure(function(){ | |
app.use(userAgent({options: 'something'})); // 各種設定等を引数として渡せる | |
}); |
ミドルウェア(userAgent.js)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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しました。
適当すぎて申し訳ないのだけど、ここではiPhone以外のUserAgentが来た時は302にstatusを変えてヘッダ変更後、next()しないでres.end()することでredirectしました。
0 件のコメント:
コメントを投稿