NodejsはどうやってWebサーバを構築しますか?

4506 ワード

Nodejsを使ってWebサーバーを構築するのはNode.jsを学習するための総合的な入門教程です.簡単なWebサーバーを完成するためには、Nodejsのいくつかの比較的重要なモジュールを勉強しなければなりません.例えば、httpプロトコルモジュール、ファイルシステム、url解析モジュール、経路解析モジュール、301リダイレクト問題などです.簡単なWebサーバーの構築方法について説明します.
一つのWebサーバとしては、以下のいくつかの機能を備えていなければならない.
1.html/.httmで終わるWebページを表示できます.
2、直接に開くことができます.js/.css/.json/.textで終わるファイルの内容
3、画像のリソースを表示する
4.自動ダウンロードで.app/.docx/zipで終わるファイル
5、形が似ているhttp://xxx.com/a/b/bディレクトリの下にindex.があるかどうかを検索します.もし表示されていないなら、そのディレクトリの下のすべてのファイルとフォルダを一覧表示し、さらにアクセスすることができます.
6、形が似ているhttp://xxx.com/a/bを選択します.  301としてリダイレクトhttp://xxx.com/a/b/このようにして、内部資源の参照転位の問題を解決することができる. 
いくつかのモジュールを導入します.

//http    
var http = require('http');
//url    
var url = require('url');
//      
var fs = require("fs");
//      
var path = require("path");
サービスを作成し、指定されたポートで傍受します.

//      
var httpServer = http.createServer(this.processRequest.bind(this));

//          
httpServer.listen(port,function(){
  console.log("[HttpServer][Start]","runing at http://"+ip+":"+port+"/");
  console.timeEnd("[HttpServer][Start]");
});
サービスを作成するには、要求を処理するために匿名関数プロcessRequestを送る必要があります.プロcessRequestは2つのパラメータを受信します.それぞれrequestとreponseで、requestオブジェクトには要求が含まれています.

processRequest:function(request,response){
  var hasExt = true;
  var requestUrl = request.url;
  var pathName = url.parse(requestUrl).pathname;

  //          ,      
  pathName = decodeURI(pathName);

  //          
  if(path.extname(pathName) === ''){
    //     /   , /  301   
    if (pathName.charAt(pathName.length-1) != "/"){
      pathName += "/";
      var redirect = "http://"+request.headers.host + pathName;
      response.writeHead(301, {
        location:redirect
      });
      response.end();
    }
    //         ,          ,     
    pathName += "index.html";
    hasExt = false; //              
  }

  //           
  var filePath = path.join("http/webroot",pathName);

  //           
  var contentType = this.getContentType(filePath);

  //       
  fs.exists(filePath,function(exists){
    if(exists){
      response.writeHead(200, {"content-type":contentType});
      var stream = fs.createReadStream(filePath,{flags:"r",encoding:null});
      stream.on("error", function() {
        response.writeHead(500,{"content-type": "text/html"});
        response.end("

500 Server Error

"); }); // stream.pipe(response); }else { // if(hasExt){ // , 404 response.writeHead(404, {"content-type": "text/html"}); response.end("

404 Not Found

"); }else { // , var html = ""; try{ // var filedir = filePath.substring(0,filePath.lastIndexOf('\\')); // var files = fs.readdirSync(filedir); // , , for(var i in files){ var filename = files[i]; html += ""; } }catch (e){ html += "

" } response.writeHead(200, {"content-type": "text/html"}); response.end(html); } } }); },
要求処理関数にはいくつかのポイントがあります.
パスの中に中国語がある場合、ブラウザは自動的にコードします(英語は変わらないです.中国語は変わります).だからアドレスを受信した後、アドレスを復号する必要があります.
アクセスパスが特定のファイルで終端していない場合、リダイレクトによって/を追加する必要があります.そうでなければ、現在のパスの静的リソースが見つかりません.
アクセス経路がディレクトリであれば、このディレクトリの下にあるすべてのファイルとフォルダを一覧表示し、クリックしてアクセスすることができます.中国語のディレクトリを正常に表示させるためには、headerにcharset=utf-8を設定します.
コアコードはこんなに多くて、大体140行ぐらいです.完全なコードはGitにアップロードされました.https://github.com/git-onepixel/Node
デモを実行するなら、cmdを開いてルートディレクトリに切り替えて、node startを実行すればいいです.
以上が本文の全部です.皆さんの勉強に役に立ちたいです.