原生nodejs学習ノート1

6893 ワード

ネット上の多くのnodejs教程や書簡は第三者モジュールを使ってnodejsアプリケーションを作成するように教えています.これはとても便利ですが、パッケージが厚すぎて、基本的なものはまだ習っていません.人のモジュール、人はどのように変えたいですか?次のバージョンでインターフェースを変えられます.あなたのアプリケーションはもうだめです.例えばgoogleなら、彼はこのようなことが好きです.ですから、私たちは下のAPIをまじめに勉強しましょう.
今回はまずページを教えましょう.
以前から関係のあるものを書きました.node.js簡単なページ出力、皆さんは予習してもいいです.
一般的に、みんなはこのような例から入門します.

var http = require("http");
http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello node.js");
  response.end();
}).listen(8888);
上のスクリプトは一つのアプリ.jsの上に書いて、コンソールを開けて、その所在ディレクトリに位置して、node appを入力して、もう一つのブラウザを開けて、入力します.http://localhost:8888/効果がわかる
上のスクリプトを分析:
  • に依存が導入されました.これは先端AMD仕様が未流行の前に、非常に不思議なものです.ただし、プロジェクトがこんなに大きくて、必ずN個のディレクトリN個のファイルに分けて、各自が一部を担当して、合併衝突のリスクを減らします.
  • require(http)が吐き出すhttpオブジェクトは元のオブジェクトで、フロントエンドのalertに似ています.set Timeoutはよく使われています.このhttpオブジェクトは更にバックエンドの大黒柱であり、WEBアプリケーションはそれから切り離せない.
  • http.creat Server方法は関数を受信し、俗にコールバックと呼ばれる.後であなたはますます多くの回調を見ることができて、nodejsの世界は回調の世界で、nodejsの発展史は回調の抗争史と
  • です.
  • このコールバックは、2つの重要なオブジェクトに送られ、要求対象と応答オブジェクト.reponseは先端にものを出力します.応答ヘッダを設定して、ブラウザに次からどうやって私達の内容を処理するかを教えます.スクリプトとして使うものもありますし、絵として使うものもあります.CSSファイルとして使うものもあれば、添付ファイルとしてダウンロードするものもあります.出力が終わりました.endメソッドを呼び出すには、実際には、レスポンスがendコールを実行するのに便利です.
  • http.creat Serverは、実際にはServerの例を返すための方法であり、あるポートを傍受するためのlistenがあります.
  • ok、これで終わりです.もっと深く入りましょう.(ここは難しいです.スキップできます.直接に次の★を見ます.)
    ここですを開けて、httpモジュールのソースコードを調べてみます.大体呼び出しました.
    
    _http_incoming
    _http_outgoing
    _http_server
    _http_client
    
    これらの4つの重要な内部モジュールは、私たちがnodejs環境でアクセスできません.httpは他の内部モジュールも引用していますが、今は無視できます._http_インカムhttp_outgoingは二つの入出力フローの対象を提供しています.流れは今後私たちが重点的に学ぶものです.このモジュールでは、廃棄された方法を除くと、主にこの3つの方法です.get、request、createServer.
    httpソースを削除します.皆さんは何を分かりますか?
    
    
    //------------------Server------------------
    var server = require('_http_server');
    exports.ServerResponse = server.ServerResponse;
    var Server = exports.Server = server.Server;
    
    exports.createServer = function(requestListener) {
      return new Server(requestListener);
    };
    
    //------------------Client------------------
    var client = require('_http_client');
    var ClientRequest = exports.ClientRequest = client.ClientRequest;
    
    exports.request = function(options, cb) {
      return new ClientRequest(options, cb);
    };
    
    exports.get = function(options, cb) { //get request     
      var req = exports.request(options, cb);
      req.end();
      return req;
    };
    
    では、レクネストListenerはどうやって伝えられますか?_。http_server内部モジュールに行って、ServerResonseはOutgoingMessageのサブクラスにすぎないことを発見しました.Serverの例はrequestイベントを通じて私たちを結びつけるcreateServerフィードバックであり、同時にconnectionイベントを通じてconnection Listenerを結び付ける方法でもあります.
    
        if (!util.isUndefined(req.headers.expect) &&
            (req.httpVersionMajor == 1 && req.httpVersionMinor == 1) &&
            continueExpression.test(req.headers['expect'])) {
          res._expect_continue = true;
          if (EventEmitter.listenerCount(self, 'checkContinue') > 0) {
            self.emit('checkContinue', req, res);
          } else {
            res.writeContinue();
            self.emit('request', req, res);
          }
        } else {
          self.emit('request', req, res);
        }
    
    resはServerResonseの実例であるvar res=new ServerResonse(req);reqはパーサーOnIncomping方法によって伝えられたものであり、パーサーOnIncompingはパー・オンインカムの一つの方法である._。http_commonの内部モジュールに追跡して、以下のいくつかの文を発見する.
    
    
       parser.onIncoming(parser.incoming, info.shouldKeepAlive)//    ,parser.incoming     req  
    
       parser.incoming = new IncomingMessage(parser.socket);
    
    はい、わかりました.reqはIncompingMessageの例です.resはServerResonse、すなわちOutgoingMessageの例です.ここは突っ込みをしなければなりません.nodejsのソースコードは混乱しています.
    ★★★またシンプルモードに切り替えます.上記の話を理解すると、私たちはなぜ「http.ServerResonse」と「http.IncompingMessage」を重点的に勉強しなければならないのかが分かります.もし皆さんがexpressのソースコードを見たら、そのrequestモジュールとreponseモジュールはこの上で拡張されています.
    
    //https://github.com/strongloop/express/blob/master/lib/request.js
    var req = exports = module.exports = {
      __proto__: http.IncomingMessage.prototype
    };
    //https://github.com/strongloop/express/blob/master/lib/response.js
    var res = module.exports = {
      __proto__: http.ServerResponse.prototype
    };
    
    長い間前に、私達はfsモジュールのfs.readFileを通じてサーバー上のあるファイルを読み込み、フロントエンドに戻ります.
    
    
    var http = require("http");
    var fs = require('fs');
    exports.start = function(){
        http.createServer(function(request, response) {
            fs.readFile('./index.html', 'utf-8',function (err, data) {//    
                if (err) throw err;
                response.writeHead(200, {"Content-Type": "text/html"});//    
                response.write(data);
                response.end();
            });
        }).listen(8888);
        console.log("server start...");
    }
    
    前にも話しましたが、今はもう流れの時代です.レスポンスは書き込み可能なストリームです.読み取り可能なストリームを作成すればいいです.
    
    var http = require("http");
    var fs = require("fs")
    http.createServer(function (request, response) {
        var readable = fs.createReadStream("./index.html")
        response.writeHead(200, {"Content-Type": "text/html"});
        readable.pipe(response);
    
    }).listen(8888);
    
    エラーが発生したら404ページにジャンプしたいです.
    
    var http = require("http");
    var fs = require("fs")
    http.createServer(function (request, response) {
        var readable = fs.createReadStream("./index.html")
        response.writeHead(200, {"Content-Type": "text/html"});
        readable.pipe(response);
        readable.on("error", function () {
            var readable = fs.createReadStream("./404.html")
            readable.pipe(response);
        })
    }).listen(8888);