淺談Node.js開發Web服務器


本文介紹下node.js是如何開發后端服務器的,如有錯誤還望指出。

一、服務器基礎知識

1.1 網站的組成

  • 網站應用程序主要分為兩大部分:客戶端服務器端

  • 客戶端:在瀏覽器中運行的部分,就是用戶看到並與之交互的界面程序。使用HTML、CSS、JavaScript構建。

  • 服務器端:在服務器中運行的部分,負責存儲數據和處理應用邏輯。

1.2 Node網站服務器

能夠提供網站訪問服務的機器就是網站服務器,它能夠接收客戶端的請求(request),能夠對請求做出響應(response)

1.3 IP地址

互聯網中設備的唯一標識。IP是lnternet Protocol Address的簡寫,代表互聯網協議地址。

1.4 域名

由於IP地址難於記憶,所以產生了域名的概念,所謂域名就是平時上網所使用的網址。
https://www.baidu.com/ => http://202.108.22.5/
雖然在地址欄中輸入的是網址但是最終還是會將域名轉換為ip才能訪問到指定的網站服務器

1.5 端口

端口是計算機與外界通訊交流的出口,用來區分服務器電腦中提供的不同的服務。

舉個例子,端口可以用實際生活中的食堂來形容,不同的打菜窗口有不同的菜式,提供不同的服務。同樣,服務器的端口也是如此,80端口對應的是HTTP(訪問web服務器)開放的,25端口對應的是SMTP(簡單郵件傳輸協議),主要用於發送郵件等等。

1.6 URL

統一資源定位符,又叫URL (Uniform Resource Locator),是專為標識lnternet網上資源位置而設的一種編址方式,我們平時所說的網頁地址指的即是URL。

URL的組成

傳輸協議://服務器IP或域名:端口/資源所在位置標識

http://www.cnblogs.com/pick/

①http:超文本傳輸協議,提供了一種發布和接收HTML頁面的方法。(后面詳細介紹)

②pick:資源所在位置標識

問:統一資源定位符是指定服務器中資源文件夾嗎?

答:不對,因為在服務器中是可以拿到客戶端的請求地址,然后對應返回的結果是服務器端說了算,如,訪問的是a.html,服務器就給你訪問b.html,這是完全可以的。

1.7 開發過程中客戶端和服務器端說明

在開發階段,客戶端(瀏覽器)和服務器端(Node)使用同一台電腦,即開發人員電腦。

  • 本機域名:localhost

  • 本地IP :127.0.0.1

1.8 HTTP協議

1.8.1 HTTP協議的概念

超文本傳輸協議(英文: HyperText Transfer Protocol,縮寫:HTTP)規定了如何從網站服務器傳輸超文本到本地瀏覽器,它基於客戶端服務器架構工作,是客戶端(用戶)和服務器端(網站)請求和應答的標准。
超文本:包含圖片、視頻、音頻等等,實際上指的是html文本。

1.8.2 報文

在HTTP請求和響應的過程中傳遞的數據塊就叫報文,包括要傳送的數據和一些附加信息,並且要遵守規定好的格式。通俗的講就是冒號開頭的鍵值對。

打開Chrome的網絡調試可以看到如下內容

1.8.3請求報文

1.請求方式(Request Method)

  • GET 請求數據:獲取請求

  • POST 發送數據:添加數據、登陸、POST相當於GET安全。

2.請求地址(Request URL)

3.獲取請求方法(Request Method)

1.8.4響應報文

1.HTTP狀態碼

  • 200 請求成功

  • 404 請求的資源沒有被找到

  • 500 服務器端錯誤

  • 400 客戶端請求有語法錯誤

2.內容類型

  • text/html

  • text/css

  • application/javascript

  • image/jpeg

  • application/json

二、node基礎知識

什么是Node?

Node是一個基於Chrome V8引擎的JavaScript代碼運行環境,能夠使得javascript脫離瀏覽器運行。適合開發聊天室,博客系統,考試系統等網站。

舉個例子:

比如,想泡壺茶喝。當時的情況是:開水沒有;水壺要洗,茶壺茶杯要洗;火生了,茶葉也有了。怎么辦?

第一種:洗好水壺,灌上涼水,放在火上;在等待水開的時間里,洗茶壺、洗茶杯、拿茶葉;等水開了,泡茶喝。

第二種:先做好一些准備工作,洗水壺,洗茶壺茶杯,拿茶葉;一切就緒,灌水燒水;坐待水開了泡茶喝。

第三種:洗凈水壺,灌上涼水,放在火上,坐待水開;水開了之后,急急忙忙找茶葉,洗茶壺茶杯,泡茶喝。

哪一種辦法省時間?我們能一眼看出第一種辦法好,后兩種辦法都窩了工。

顯然,Node.js是第一種方法,有着非阻塞事件驅動的特性。

運行環境

  • 瀏覽器(軟件)能夠運行JavaScript代碼,瀏覽器就是JavaScript代碼的運行環境

  • Node(軟件)能夠運行JavaScript代碼,Node就是JavaScript代碼的運行環境

為什么選擇Node使用?

  • JavaScript語法開發后端應用

  • 一些公司要求前端工程師掌握Node開發

  • 生態系統活躍,有大量開源庫可以使用

  • 前端開發工具大多基於Node開發

Node.js的組成

  • JavaScript 由三部分組成,ECMAScriptDOMBOM。

  • Node.js是由ECMAScriptNode 環境提供的一些附加API組成的,包括文件、網絡、路徑等等一些更加強大的 API。

JavaScript:

  • ECMAScript:JavaScript語言的核心,規定了語言的語法部分DOM

  • BOM:瀏覽器為了讓他們控制,為這門語言提供的API

Node.js:

  • ECMAScript:Node.js語言的核心,規定了語言的語法部分

  • node環境提供api

Node.js 特點

  1. 事件驅動:在 Node.js 中,客戶端請求建立連接,提交數據等行為,會觸發相應的事件。Node.js 在一個時刻,只能執行一個事件回調函數,但是在執行一個事件回調函數的中途,可以轉而處理其他事件,然后返回繼續執行原事件的回調函數。
  2. 非阻塞 I/O:Node.js 中采用了非阻塞型 I/O 機制,在執行了訪問數據庫的代碼之后,將立即轉而執行其后面的代碼,把數據庫返回結果的處理代碼放在回調函數中,從而提高了程序的執行效率。
  3. 輕量可伸縮,適用於實時數據交互應用。
  4. 單線程:好處是減少內存開銷,不用像多線程編程那樣處處在意狀態同步的問題。缺點是錯誤會引起整個應用的退出。

Node.js基礎語法

所有ECMASCript語法在Node環境中都可以使用。
在Node環境下執行代碼,使用Node命令執行后綴為js的文件即可

Node.js全局對象global

瀏覽器中全局對象是window,在Node中全局對象是global
Node中全局對象下有以下方法,可以在任何地方使用,global可以省略。
console.log() 在控制台中輸出
setTimeout() 設置超時定時器
clearTimeout() 清除超時時定時器
setInterval() 設置間歇定時器
clearInterval() 清除間歇定時器

創建一個Web服務器

新建一個app.js

//引入系統模塊
const http = require('http');
//創建Web服務器對象
const app = http.createServer();
//當客戶端發送請求的時候
app.on('request', (req, res) => {
    //響應
    res.end('<h1>hello world</h1>');
});
//監聽端口
app.listen(3000);
console.log('服務器已啟動,監聽3000端口,請訪問本機域名localhost:3000'); 
  1. 在node.js中創建web服務器需要用到系統模塊http,所以在系統模塊上使用require模塊引入http
  2. 使用createServer創建服務器,返回值是網站服務器對象
  3. node.js和JavaScript都是基於事件驅動的語言,比如JavaScript當用戶點擊某個按鈕的時候做什么事情。 node.js是當用戶接受什么請求做什么事情。
  4. 添加什么事件呢?添加請求事件,也就是request事件(請求的意思)。添加請求的語法:服務器.on
  5. on就是添加事件的意思,第一個參數是request請求,第二個參數是事件處理函數,當事件來的時候就會執行事件處理函數。
  6. 這個事件處理函數有兩個參數,第一個單詞req是request單詞的簡寫,代表請求對象,對象中存儲了請求的一些信息,比如請求的地址、請求的ip;第二個單詞res是response單詞的簡寫,代表響應對象,使用這個對象的方法對客戶端發來的請求做出響應。
  7. 這個服務器還要經過一個端口才能向外界進行服務,如何監聽端口呢?在網站app對象下有個方法叫listen,listen監聽的就是一個端口號。在node.js中習慣上將這個寫出3000

運行

打開CMD或者PowerShell輸入以下命令運行app.js文件

node aap.js

運行結果

服務器顯示標識,利用標識響應不同的內容

路由

http://localhost:3000/index

http://localhost:3000/login

路由是指客戶端請求地址與服務器端程序代碼的對應關系。簡單的說,就是請求什么響應什么。

在原先的基礎上增加路由功能,並優化代碼

//1.引入系統模塊http
//2.創建網站服務器
//3.為網站服務器對象添加請求事件
//4.實現路由功能

const http = require('http');
const url = require('url');
const app = http.createServer();

app.on('request', (req, res) => {
    //1.獲取客戶端的請求方式 
    const method = req.method.toLowerCase();
    //2.獲取請求地址
    const pathname = url.parse(req.url).pathname;
    //3.請求正常,服務器添加字符編碼格式
    res.writeHead(200, {
        'content-type': 'text/html;charset=utf8'
    });
	//4.判斷客戶端輸入的域名,服務器響應其內容
    if (method == 'get') {
        if (pathname == '/' || pathname == '/index') {
            res.end('歡迎來到首頁');
        } else if (pathname == '/list') {
            res.end('歡迎來到列表頁')
        } else {
            res.end('您訪問的頁面不存在')
        }
    } else if (method == 'post') {

    }
}).listen(3000);
console.log('服務器啟動成功');


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM