1. 程式人生 > >如何使用nodejs建立Web伺服器

如何使用nodejs建立Web伺服器

使用 Node 建立 Web 伺服器

什麼是 Web 伺服器?

Web伺服器一般指網站伺服器,是指駐留於因特網上某種型別計算機的程式,Web伺服器的基本功能就是提供Web資訊瀏覽服務。它只需支援HTTP協議、HTML文件格式及URL,與客戶端的網路瀏覽器配合。

大多數 web 伺服器都支援服務端的指令碼語言(php、python、ruby)等,並通過指令碼語言從資料庫獲取資料,將結果返回給客戶端瀏覽器。

目前最主流的三個Web伺服器是Apache、Nginx、IIS。


Node.js 提供了 http 模組,http 模組主要用於搭建 HTTP 服務端和客戶端,使用 HTTP 伺服器或客戶端功能必須呼叫 http 模組,程式碼如下:
var http = require('http');
在通常的伺服器中,資料流通的方式是客戶先通過瀏覽器進行傳送請求,伺服器在專案中進行查詢,然後進客戶所需要的頁面進行返回,在查詢的過程中可能存在兩種情況,就是存在和不存在,當然,我們會做出判斷,下面就是簡單的伺服器實現過程: 1、編寫伺服器程式碼server.js
var http=require('http');
var fs = require('fs');
var url = require('url');

//建立伺服器
http.createServer(function(request,response) {
    //解析請求,包括檔名
    var pathname= url.parse(request.url).pathname;
    //輸出請求的檔名
    console.log("Request for "+ pathname + "  received.");

    //從檔案系統中都去請求的檔案內容
    fs.readFile(pathname.substr(1),function(err, data) {
        if(err) {
            console.log(err);
            //HTTP 狀態碼 404 : NOT FOUND
            //Content Type:text/plain
            response.writeHead(404,{'Content-Type': 'text/html'});
        }
        else {
            //HTTP 狀態碼 200 : OK
            //Content Type:text/plain
            response.writeHead(200,{'Content-Type': 'text/html'});

            //寫會相應內容
            response.write(data.toString());
        }
        //傳送響應資料
        response.end();
    });
}).listen(8081);

console.log('Server running at http://127.0.0.1:8081/');
通過上面程式碼,我們就能夠實現伺服器對於檔案的查詢,下面,我們就進行建立一個html檔案,然後通過瀏覽器進行訪問 2、編寫html檔案(index.html),用於瀏覽器進行請求
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
   這是一個用於進行nodejs伺服器測試的html檔案,我們能夠通過在瀏覽器上面輸入
   http://127.0.0.1:8081/WebServer/index.html進行訪問
</body>
</html>
建立完之後,我們進行測試,現在我的目錄結構是這樣的:

3、進行測試
    (1) 首先我們啟動伺服器,使用命令node WebServer/server.js  
    (2) 在瀏覽器進行訪問,在url欄中輸入http://127.0.0.1:8081/WebServer/index.html
    其顯示效果如下所示:
後臺效果如下所示:
當然,我們也能夠通過訪問通過http://127.0.0.1:8081/LoveYou.html訪問server.js資料夾外邊的檔案,進行到這裡,我們就可以得到檔案返回給前端,但是有些同學可能會問,樣式該怎麼做??如下面程式碼,我們進行了樣式的定義,修改了兩個div的大小,並且給div設定邊框
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
    <style>
        body {
            border: 1px solid red;
        }

        div {
            border-radius: 10px;
            width: 500px;
            height: 200px;
            border: 2px solid green;
        }
    </style>
</head>
<body>
這是一個用於進行nodejs伺服器測試的html檔案,我們能夠通過在瀏覽器上面輸入
http://127.0.0.1:8081/WebServer/index.html進行訪問
<div>1</div>
<div>2</div>
</body>
</html>
效果如下所示,
有了這些,我們還會問,你這樣直接將樣式寫在html中,我可不幹,我要把樣式寫道另外單獨一個檔案中,然後通過引用的方式引入,於是就會有人使用下面程式碼:
    <link rel="stylesheet" href="http://127.0.0.1:8081/WebServer/index.css">

然而,這段程式碼並不會起作用,因為傳遞給前端的方式Content-Type是有問題的,需要我們的伺服器進行下一步操作,也就是處理靜態檔案。既然傳給前端時需要告訴type是css,那麼我們就進行區分對待,如下面程式碼,我們對server.js進行修改如下:
var http=require('http');
var fs = require('fs');
var url = require('url');

//建立伺服器
http.createServer(function(request,response) {
  //解析請求,包括檔名
  var pathname= url.parse(request.url).pathname;
  //輸出請求的檔名
  console.log("Request for "+ pathname + "  received.");
  //當請求static資料夾時,設定檔案返回型別是text/css
  var firstDir = pathname && pathname.split('/')[2];
  var ContentType = null;
  if (firstDir && firstDir === 'static') {
    ContentType = {'Content-Type': 'text/css'};
  } else {
    ContentType = {'Content-Type': 'text/html'}
  }

  //從檔案系統中去請求的檔案內容
  fs.readFile(pathname.substr(1),function(err, data) {
    if(err) {
      console.log(err);
      //HTTP 狀態碼 404 : NOT FOUND
      //Content Type:text/plain
      response.writeHead(404, {'Content-Type': 'text/html'});
    }
    else {
      //HTTP 狀態碼 200 : OK
      //Content Type:text/plain
      response.writeHead(200, ContentType);

      //寫會回相應內容
      response.write(data.toString());
    }
    //傳送響應資料
    response.end();
  });
}).listen(8081);

console.log('Server running at http://127.0.0.1:8081/');
接著,我們需要在專案中建立一個static資料夾,如下面所示結構:
在static資料夾中建立index.css檔案,程式碼內容如下所示:
body {
    border: 1px solid blue;
}

div {
    border-radius: 10px;
    width: 400px;
    height: 200px;
    border: 2px solid yellow;
}
也就是修改body邊框為藍色,div邊框為黃色,同時我們需要更新index.html中檔案內容如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
    <link rel="stylesheet" href="http://127.0.0.1:8081/WebServer/static/index.css">
</head>
<body>
這是一個用於進行nodejs伺服器測試的html檔案,我們能夠通過在瀏覽器上面輸入
http://127.0.0.1:8081/WebServer/index.html進行訪問
<div>1</div>
<div>2</div>
</body>
</html>
也就是通過引入的方式將樣式引入到html檔案中,然後在瀏覽器檢視內容,效果如下所示: 很明顯,我們的樣式已經通過引入的方式引進到html頁面中了,同樣的原理,我們能夠進行將js也通過引入的方式進行使用,在這裡我就不一一貼出程式碼了,看看效果如下所示:

使用 Node 建立 Web 客戶端

Node 建立 Web 客戶端需要引入 http 模組,建立 client.js 檔案,程式碼如下所示:

var http = require('http');
//用於請求的選項
var options = {
    host: 'localhost',
    port: '8081',
    path: '/WebServer/index.html'
};
 //處理響應的回撥函式
var callback= function(response) {
    //不斷更新資料
    var body = '';
    response.on('data',function(data) {
        body+=data;
    });
    response.on('end', function() {
        //資料接收完成
        console.log(body);
    });
};
//向伺服器端傳送請求
var req = http.request(options, callback);
req.end();
新開啟終端,執行程式如下所示: