nodejs学習2:Expressのルート機能

4574 ワード

マクロ的には、ルーティングシステムは、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(面に向かってプログラミングする)をすると便利そうです.つまり、既存のコードに影響を及ぼさないように機能を加えることができます.
締め括りをつける
  • このように見ると、next()というモデルはよく使われているようです.よく理解してください.
  • expressのルーティングは、まずmethodに基づいて対応する配列を見つけ、その後、pathに基づいて、配列中のRouteが要求を満たしているかどうかを順次チェックし、対応するcalback関数を実行するかを決定する.一般的な表記によると(res.end()res.render())現在の要求を終了する指示が見つかったら、現在のコードを実行すればいいです.配列の後のRoute
  • を確認し続けません.
  • マクロ的に言えば、ルーティングシステムは、express内部関数配列の一つの関数にすぎない.
    以上の点を知っていれば十分です.後のテストは非典型的なコードです.遊ぶ意味はもっと大きいです.
    以下は主な試験コードです.
    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