nodejs学習2:Expressのルート機能
マクロ的には、ルーティングシステムは、express内部関数配列の関数にすぎない(第一編を参照)、そして位置は相対的に後方にある.
一番簡単なルートシステムは辞書です.urlによって探している処理関数でいいです.もちろんexpressの実現はそんなに簡単ではありません.
express内部にはmapがあります.各要求方法(get,post...)にマッピングされています.各ルートオブジェクトの配列は、下の図のようにマッピングされます.
実際には、次を書くごとに
expressは対応する処理関数にルーティングするために、methodとpathの両方が条件を満たす必要があります.
1.methodは'get'、'post'などで、これによってmapの中の該当する属性を見つけます.
2.そして配列の中で、パスが中のRouteの要求に合っているかどうかを確認します.該当するcalback関数は順次(後の説明を見て)実行されます.calback関数の署名は以下の通りです.
calbackの中で、要求応答周期が終了します.nextがあるべきではないです.次のRouteも確認できません.
app.jsの
上のいずれかのnext()を外してみてもいいです.効果はどうですか?
使い道
これらは何の役に立つか分かりますか?あまり役に立たないと思います.
でも、ちょっと役に立つかもしれません.例えば:
何年も私のホームページを訪問していないので、とても悲しいです.今は機能を追加したいです.誰かが私のホームページを訪問してくれて、メールを送ってくれて、嬉しいです.それなら既存のホームページの処理ロジックは何も変えなくてもいいです.比較的前の位置に書くだけです.
最後に、このような方式は、AOP(面に向かってプログラミングする)をすると便利そうです.つまり、既存のコードに影響を及ぼさないように機能を加えることができます.
締め括りをつけるこのように見ると、next()というモデルはよく使われているようです.よく理解してください. expressのルーティングは、まずmethodに基づいて対応する配列を見つけ、その後、pathに基づいて、配列中のRouteが要求を満たしているかどうかを順次チェックし、対応するcalback関数を実行するかを決定する.一般的な表記によると( を確認し続けません.マクロ的に言えば、ルーティングシステムは、express内部関数配列の一つの関数にすぎない.
以上の点を知っていれば十分です.後のテストは非典型的なコードです.遊ぶ意味はもっと大きいです.
以下は主な試験コードです.
一番簡単なルートシステムは辞書です.urlによって探している処理関数でいいです.もちろんexpressの実現はそんなに簡単ではありません.
express内部にはmapがあります.各要求方法(get,post...)にマッピングされています.各ルートオブジェクトの配列は、下の図のようにマッピングされます.
実際には、次を書くごとに
//var app = express();
app.get('/',callback);//callback
map get push Route, app.get。 app.get ,
//first
app.get('/',[callback1,callback2]);
//second
app.get('/',callback1);
app.get('/',callback2);
ただし、最初のmapのget配列では、1つのRoute(中のcalbacksには2つの要素があります)にpushが入ります.2つ目はpushが2つのRouteに進みます.(それぞれのcalbacksは1つの要素しかありません.)次の図のようになります.expressは対応する処理関数にルーティングするために、methodとpathの両方が条件を満たす必要があります.
1.methodは'get'、'post'などで、これによってmapの中の該当する属性を見つけます.
2.そして配列の中で、パスが中のRouteの要求に合っているかどうかを確認します.該当するcalback関数は順次(後の説明を見て)実行されます.calback関数の署名は以下の通りです.
function(req,res,next){}
一つのcalbackがレスポンスを要求するライフサイクルを終了していない場合(例えば、res.end('))は、一般的に最後にnext()を書く必要があります.次のように.function(req,res,next){
//..
next();
}
これで、次のRouteをチェックし続けます.calbackの中で、要求応答周期が終了します.nextがあるべきではないです.次のRouteも確認できません.
//
function(req,res,next){
//..
res.end('...');// res.render('...')
}
試験一:何度も同じ住所に対してap.getを行うapp.jsの
app.get('/', routes.index);
の上に次のように書いてあります.app.get('/',function(req,res,next){
console.log("11");
next()
});
app.get('/',function(req,res,next){
console.log("22");
next()
});
ホームページを要求するときは、コンソールから順に11,22を出力し、最後にroutes.index関数を実行して、ブラウザにデータを送信します.上のいずれかのnext()を外してみてもいいです.効果はどうですか?
使い道
これらは何の役に立つか分かりますか?あまり役に立たないと思います.
でも、ちょっと役に立つかもしれません.例えば:
何年も私のホームページを訪問していないので、とても悲しいです.今は機能を追加したいです.誰かが私のホームページを訪問してくれて、メールを送ってくれて、嬉しいです.それなら既存のホームページの処理ロジックは何も変えなくてもいいです.比較的前の位置に書くだけです.
app.get('/',function(req,res,next){
emaiTo('[email protected]',' , ');
next()
});
もう一つのより現実的な例はアクセス量記録かもしれない.var i = 0;
app.get('*',function(req,res,next){
console.log(++i);
next();
});
'*'はワイルドカードなので、どのパスにもアクセスできます.localhost:3000/
localhost:3000/nopage
i都会自増、しかもnodejs単スレッドのスレッドモデルのおかげで、これでいいです.最後に、このような方式は、AOP(面に向かってプログラミングする)をすると便利そうです.つまり、既存のコードに影響を及ぼさないように機能を加えることができます.
締め括りをつける
res.end()
、res.render()
)現在の要求を終了する指示が見つかったら、現在のコードを実行すればいいです.配列の後のRoute 以上の点を知っていれば十分です.後のテストは非典型的なコードです.遊ぶ意味はもっと大きいです.
以下は主な試験コードです.
var i = 0;
app.post('*' ,function(req,res,next){
res.end("nothing for post");
});
app.get('*',function(req,res,next){
console.log(++i);
next();
});
app.get('/',function(req,res,next){
console.log("11");
next()
});
app.get('/',function(req,res,next){
console.log("22");
next()
});
// express ,
app.get('/', routes.index);
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
原文の住所:http://www.html-js.com/article/Nodejs-beginner-beginners-node-two-Express-routing