Node.js – 使用 http(內建模組) 建立 Web Server

測試環境為 CentOS 8 x86_64

Node.JS 所需套件須透過 npm 來下載,所以必須安裝 npm (Node Package Manager) 套件.

[root@localhost ~]# yum install -y nodejs
[root@localhost ~]# yum install -y npm

檢視一下 Node.JS 與 npm 版本.

[root@localhost ~]# node -v
v10.23.1
[root@localhost ~]# npm -v
6.14.10

測試一下 Node.js 是否可以常運作.使用 Node.js 官方網站程式範例 https://nodejs.org/en/about/

[root@localhost ~]# vi Node.js
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

程式說明:

  1. const http = require('http');
    
    • const
      變數宣告 ( let , var 也是變數宣告,但這3種使用上略微不同) .
    • require
      透過 require 去載入模組.並把得到的 屬性,函式(函數 Function)或是物件 儲存到變數.
    • require(‘http’)
      去呼叫 Node.js 內建模組 HTTP, 該模組允許 Node.js 通過 HTTP 傳輸資料.
  2. const hostname = '127.0.0.1';
    const port = 3000;
    

    宣告 2 個變數 hostname (‘ ‘ 表示為字串)與 port (數字).

  3. const server = http.createServer((req, res) => {
      res.statusCode = 200;
      res.setHeader('Content-Type', 'text/plain');
      res.end('Hello World');
    });
    

    第一次看到這個語法,完全不懂是在寫什麼.大概可以區分成以下2塊.

    • http.createServer 函式本身
      http.createServer([options][, requestListener]) 函式用來建立一個 HTTP 伺服器.需要 requestListener 參數,可以使用 server.listen 函數(如前範例)來定義,或是直接在最後加上 .listen(Port Number).

      const http = require('http');
      
      const server = http.createServer((req, res) => {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/plain');
        res.end('Hello World');
      }).listen(3000);
      
    • (req, res) => { … } 函數
      下面這一段,就是要傳給 http.createServer 函數的 options,但以 箭頭函式運算式(Arrow Function Expression)類似 Function 語法 的方式傳入(函數的傳入值可以是另外一個自訂函數).

      (req, res) => {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/plain');
        res.end('Hello World');
      }
      

      我們可以把它看成 function (req, res) { … } ,不過與 箭頭函式運算式 使用上略微不同.

      function (req, res) {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/plain');
        res.end('Hello World');
      }
      

      { … } 裡面是用來處理 客戶端向 http server 發送過來的請求 req(require : 請求物件) ,以及回應 res(respone : 響應物件).

    • res.statusCode = 200;
      response.statusCode = 200 代表成功的 HTTP 標準回應請求.
    • res.setHeader(‘Content-Type’, ‘text/plain’);
      response.setHeader(name, value) , 代表 Content-Type : text/html , 回傳值為 text 或是 html .
    • res.end(‘Hello World’);
      response.end([data[, encoding]][, callback]),完成發送請求.
      通常寫法會用 res.write + res.end

      res.write('Hello World');
      res.end();
      

    當有多種 req(require : 請求物件) 可以用 if else 來完成,或是使用另外一個 Express 模組來處理 – TBD .

    const http = require('http');
    var server=http.createServer((req,res) => {
            if(req.url=='/'){
                res.writeHead(200,{'Content-Type':'text/html'});
                res.write('Main Page');
                res.end();
            }else if(req.url=='/1'){
                res.writeHead(200,{'Content-Type':'text/html'});
                res.write('Page 1');
                res.end();
            }else if(req.url=='/2'){
                res.writeHead(200,{'Content-Type':'text/html'});
                res.write('PAge 2');
                res.end();
            }else
                res.end('Invalid Request!');
    }).listen(3000);
    

    執行結果.

    [root@localhost ~]# curl http://127.0.0.1:3000
    Main Page
    [root@localhost ~]# curl http://127.0.0.1:3000/1
    Page 1
    [root@localhost ~]# curl http://127.0.0.1:3000/2
    PAge 2
    

    函數, 更多關於 HTTP 請參考 – https://nodejs.org/dist/latest-v4.x/docs/api/http.html

    • res.writeHead
      response.writeHead(statusCode[, statusMessage][, headers])
    • res.write
      response.write(chunk[, encoding][, callback])
    • res.end
      response.end([data[, encoding]][, callback])
  4. server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
    });
    
    • server.listen([port][, hostname][, backlog][, callback])
      指定 http port 與 hostname.
    • console.log(`Server running at http://${hostname}:${port}/`);
      console.log([data][, …args]) ,Console 模組提供了一個簡單的 Debugging 資訊在標準輸出並加上換行 newline 來顯示.

Node.JS Hello World 程式已經寫好,可以透過 Node 來測試一下.

[root@localhost ~]# node Node.js &
[1] 7508
Server running at http://127.0.0.1:3000/

Node.JS Hello World 這程式就在 http://127.0.0.1:3000/ 等待被連線,可以透過 Firefox , Chrome …瀏覽器或是指令版的 curl 瀏覽器來檢視(最簡單快速)

[root@localhost ~]# curl http://127.0.0.1:3000/
Hello World

可以看到 Hello World 就代表 Node.JS 無誤.

不用時就可以殺除該 Node.JS .

[root@localhost ~]# ps -aux | grep -i node
root        7508  0.2  0.8 569892 34012 pts/1    Sl   23:52   0:00 node Node.js
root        7527  0.0  0.0   9208  1068 pts/1    S+   23:52   0:00 grep --color=auto -i node
[root@localhost ~]# kill 7508
[root@localhost ~]# ps -aux | grep -i node
root        7601  0.0  0.0   9208  1068 pts/1    R+   00:00   0:00 grep --color=auto -i node
[1]+  Terminated              node Node.js
沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料