初心者のnodejs一:ExpressのAPIに酔われないようにしてください.

31486 ワード

初学nodejs
このシリーズは入門シリーズではありません.実は私はまだ入門していません.入門するなら、皆さんにオススメです.
1 一緒にnodejsを勉強します.
2 BYVoid大神の『Node.js開発ガイド』大神さんが書いた教程ですが、疑問を持って見に行きます.
このシリーズは主にいくつかの話をしています.私が初めてnodejsを勉強した時、迷ったところです.困っていますので、たまに深く研究します.だから、初心者といっても、簡単ではないかもしれません.
第一篇:ExpressのAPIに酔われないようにしてください.
今nodeを学んで、Expressを注文しに来ないで、すべて人に挨拶することができません.しかし、私は先ほど接触した時、APIが多いと感じました.混乱しています.しょうがないです.脳の容量が足りないです.でも、地下鉄というものがあります.いろいろなことが分かりたいです.
まず一番簡単なnode版hello worldをください.
var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World
'
); }).listen(1337, '127.0.0.1');
上のコードはnodejsのウェブサイトから来て、とても簡単で、お願いが来ました.createServerに送る匿名の関数でお願いを処理します.
Expressを使ったコードを見てみます.
var app = express(); //...     http.createServer(app).listen(app.get('port'), function(){
    console.log('Express server listening on port ' + app.get('port'));
});
対照的に、express()を実行すると、関数を返します.
function(req,res){//...} 
そして要求はいずれもappという関数によって処理されます.
expressの内部には、関数の配列があり、この配列taskと呼ばれています.各要求expressの内部では、順番にこの配列の関数を実行します.この関数配列には、各関数の署名が次のようになると考えられます.
function(req,res){//...} 
でも、実は
function(req,res,next){//...} 
このnextは、次の関数のことです.あとはテストを書いて、このnextを体験します.まずまとめてみます.
典型的なexpressを使ったap.jsに対して、以下のようなことをしました.
1.関連モジュールの導入2.var ap=express()を実行した後、
  • .ap.setを用いてexpress内部のいくつかのパラメータ(options)
  • を設定する.
  • は、app.useを用いて関数を登録し、そのtaskの配列にプッシュ操作すると簡単に考えられます.
  • 3.http.creat Serverを通じてapで要求を処理する試験1.expressにカスタム関数を登録する
    expressに登録した関数は、満足する必要があります.
    1.次のようになる
    function(req,res,next){
        //...            next();
    }
    
    2.app.use(customerFun)は次の2つの前に書く
    app.use(app.router);
    app.use(express.static(path.join(__dirname, 'public')));
    
    第2の点については、ルーティング後または静的リソースが要求された後に、応答を要求するライフサイクルは実質的に終了したためであり、この後に加えて要求処理を行うことは、何の意味もない.
    第1点について、コードを書けばいいです.
    app.use(function(req,res,next){
        console.log("111");
        next();
    });
    
    next()を書かないと、後で登録した関数が実行されなくなりますので、試してみたら分かります.
    もう一つ:
    app.use(function(req,res,next){
        console.log('111');
        next();
        console.log('222');
    });
    
    app.use(function(req,res,next){
        console.log("333");
        next();
    });
    
    コンソールの出力の順序は、111 333 222である.
    二next()の動作原理をテストします.
    全体の処理要求のモデルはまだ簡単です.上の過程を理解した後、expressを利用しないで、自分で上の過程を実現できますか?主にnext()のブロックをどのように処理しますか?
    簡単に実現できると書いてありますが、テストは利用できます.ここで皆さんと議論します. 5行目 あの関数は短いですが、時間がかかりました.
    var http = require('http');
    function express(){
        var funcs = [];
    
        var expr = function(req,res){
            var i = 0;
            function next(){            
                var task = funcs[i++];
                if(!task) return;
                task(req,res,next);
            }
            next();
        }
        expr.use=function(f){
            funcs.push(f);
        }
        return expr;
    }
    var app = express();
    
    app.use(function(req,res,next){
        console.log('haha');
        next();
    });
    app.use(function(req,res,next){
        console.log('hehe');
        next();
    });
    app.use(function(req,res){
        res.end("there is nothing happened");
    });
    
    http.createServer(app).listen('3000', function(){
      console.log('Express server listening on port 3000');
    });
    
    サービスを開始したら、一つの要求ごとに、コンソールから順番にhahahaheを出力します.そして、ブラウザはthere is nothing happenedです.
    もちろん、もっと深いステップをするなら、元のコードを見に行きます.実はこの部分の主なコードはconnectの中にあります.connect/lib/proto.jsのソースファイルの中で、主にap.useとap.handleの二つの関数の中にあります.
    訂正:
    上に述べたように、ユーザー定義の関数は二つの条件を満たすべきです.一般的にはそうです.しかし、両方とも満足できないこともあります.例えば、ユーザー定義の関数は4パラメータのもので、最後に汎用のerror処理をします.下の2つの後に.
        app.use(app.router);
    app.use(express.static(path.join(__dirname, 'public')));
    
    もう一つ追加できます
        app.use(function(err,req,res,next){
              if(err){
                     //                            console.log(err.message);
                     console.log(err.stack);
                     res.end('404')  
              }
        });