什么是 http 模塊
回顧:什么是客戶端、什么是服務(wù)器?
在網(wǎng)絡(luò)節(jié)點(diǎn)中,負(fù)責(zé)消費(fèi)資源的電腦,叫做客戶端;負(fù)責(zé)對外提供網(wǎng)絡(luò)資源的電腦,叫做服務(wù)器。
http 模塊是 Node.js 官方提供的、用來創(chuàng)建 web 服務(wù)器的模塊。通過 http 模塊提供的 http.createServer() 方法,就能方便的把一臺(tái)普通的電腦,變成一臺(tái) Web 服務(wù)器,從而對外提供 Web 資源服務(wù)。
如果要希望使用 http 模塊創(chuàng)建 Web 服務(wù)器,則需要先導(dǎo)入它
進(jìn)一步理解 http 模塊的作用
服務(wù)器和普通電腦的區(qū)別在于,服務(wù)器上安裝了 web 服務(wù)器軟件,例如:IIS、Apache 等。通過安裝這些服務(wù)器軟件,就能把一臺(tái)普通的電腦變成一臺(tái) web 服務(wù)器。
在 Node.js 中,我們不需要使用 IIS、Apache 等這些第三方 web 服務(wù)器軟件。因?yàn)槲覀兛梢曰?Node.js 提供的
http 模塊,通過幾行簡單的代碼,就能輕松的手寫一個(gè)服務(wù)器軟件,從而對外提供 web 服務(wù)
服務(wù)器相關(guān)的概念
IP 地址
IP 地址就是互聯(lián)網(wǎng)上每臺(tái)計(jì)算機(jī)的唯一地址,因此 IP 地址具有唯一性。如果把“個(gè)人電腦”比作“一臺(tái)電話”,那么“IP地址”就相當(dāng)于“電話號碼”,只有在知道對方 IP 地址的前提下,才能與對應(yīng)的電腦之間進(jìn)行數(shù)據(jù)通信。
IP 地址的格式:通常用“點(diǎn)分十進(jìn)制”表示成(a.b.c.d)的形式,其中,a,b,c,d 都是 0~255 之間的十進(jìn)制整數(shù)。例如:用點(diǎn)分十進(jìn)表示的 IP地址(192.168.1.1)
注意:
① 互聯(lián)網(wǎng)中每臺(tái) Web 服務(wù)器,都有自己的 IP 地址,例如:大家可以在 Windows 的終端中運(yùn)行 ping www.baidu.com 命令,即可查看到百度服務(wù)器的 IP 地址。
② 在開發(fā)期間,自己的電腦既是一臺(tái)服務(wù)器,也是一個(gè)客戶端,為了方便測試,可以在自己的瀏覽器中輸入 127.0.0.1 這個(gè)IP 地址,就能把自己的電腦當(dāng)做一臺(tái)服務(wù)器進(jìn)行訪問了。
域名和域名服務(wù)器
盡管 IP 地址能夠唯一地標(biāo)記網(wǎng)絡(luò)上的計(jì)算機(jī),但I(xiàn)P地址是一長串?dāng)?shù)字,不直觀,而且不便于記憶,于是人們又發(fā)明了另一套字符型的地址方案,即所謂的域名(Domain Name)地址。
IP地址和域名是一一對應(yīng)的關(guān)系,這份對應(yīng)關(guān)系存放在一種叫做域名服務(wù)器(DNS,Domain name server)的電腦中。使用者只需通過好記的域名訪問對應(yīng)的服務(wù)器即可,對應(yīng)的轉(zhuǎn)換工作由域名服務(wù)器實(shí)現(xiàn)。因此,域名服務(wù)器就是提供 IP 地址和域名之間的轉(zhuǎn)換服務(wù)的服務(wù)器。
注意:
① 單純使用 IP 地址,互聯(lián)網(wǎng)中的電腦也能夠正常工作。但是有了域名的加持,能讓互聯(lián)網(wǎng)的世界變得更加方便。
② 在開發(fā)測試期間, 127.0.0.1 對應(yīng)的域名是 localhost,它們都代表我們自己的這臺(tái)電腦,在使用效果上沒有任何區(qū)別。
端口號
計(jì)算機(jī)中的端口號,就好像是現(xiàn)實(shí)生活中的門牌號一樣。通過門牌號,外賣小哥可以在整棟大樓眾多的房間中,準(zhǔn)確把外賣送到你的手中。
同樣的道理,在一臺(tái)電腦中,可以運(yùn)行成百上千個(gè) web 服務(wù)。每個(gè) web 服務(wù)都對應(yīng)一個(gè)唯一的端口號??蛻舳税l(fā)送過來的網(wǎng)絡(luò)請求,通過端口號,可以被準(zhǔn)確地交給對應(yīng)的 web 服務(wù)進(jìn)行處理。
注意:
① 每個(gè)端口號不能同時(shí)被多個(gè) web 服務(wù)占用。
② 在實(shí)際應(yīng)用中,URL 中的 80 端口可以被省略。
創(chuàng)建最基本的 web 服務(wù)器
1. 創(chuàng)建 web 服務(wù)器的基本步驟
① 導(dǎo)入 http 模塊
② 創(chuàng)建 web 服務(wù)器實(shí)例
③ 為服務(wù)器實(shí)例綁定 request 事件,監(jiān)聽客戶端的請求
④ 啟動(dòng)服務(wù)器
// 1. 導(dǎo)入 http 模塊
const http = require('http')
// 2. 創(chuàng)建 web 服務(wù)器實(shí)例
const server = http.createServer()
// 3. 為服務(wù)器實(shí)例綁定 request 事件,監(jiān)聽客戶端的請求
server.on('request', function (req, res) {
console.log('Someone visit our web server.')
})
// 4. 啟動(dòng)服務(wù)器
server.listen(8080, function () {
console.log('server running at http://127.0.0.1:8080')
})
req 請求對象
只要服務(wù)器接收到了客戶端的請求,就會(huì)調(diào)用通過 server.on() 為服務(wù)器綁定的 request 事件處理函數(shù)。
如果想在事件處理函數(shù)中,訪問與客戶端相關(guān)的數(shù)據(jù)或屬性,可以使用如下的方式:
res請求對象
在服務(wù)器的 request 事件處理函數(shù)中,如果想訪問與服務(wù)器相關(guān)的數(shù)據(jù)或屬性,可以使用如下的方式
const http = require('http')
const server = http.createServer()
// req 是請求對象,包含了與客戶端相關(guān)的數(shù)據(jù)和屬性
server.on('request', (req, res) => {
// req.url 是客戶端請求的 URL 地址
const url = req.url
// req.method 是客戶端請求的 method 類型
const method = req.method
const str = `Your request url is ${url}, and request method is ${method}`
console.log(str)
// 調(diào)用 res.end() 方法,向客戶端響應(yīng)一些內(nèi)容,并結(jié)束這次請求的處理過程
res.end(str)
})
server.listen(80, () => {
console.log('server running at http://127.0.0.1')
})
解決中文亂碼問題
當(dāng)調(diào)用 res.end() 方法,向客戶端發(fā)送中文內(nèi)容的時(shí)候,會(huì)出現(xiàn)亂碼問題,此時(shí),需要手動(dòng)設(shè)置內(nèi)容的編碼格式:
const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
// 定義一個(gè)字符串,包含中文的內(nèi)容
const str = `您請求的 URL 地址是 ${req.url},請求的 method 類型為 ${req.method}`
// 調(diào)用 res.setHeader() 方法,設(shè)置 Content-Type 響應(yīng)頭,解決中文亂碼的問題
res.setHeader('Content-Type', 'text/html; charset=utf-8')
// res.end() 將內(nèi)容響應(yīng)給客戶端
res.end(str)
})
server.listen(80, () => {
console.log('server running at http://127.0.0.1')
})
根據(jù)不同的 url 響應(yīng)不同的 html 內(nèi)容
1. 核心實(shí)現(xiàn)步驟
① 獲取請求的 url 地址
② 設(shè)置默認(rèn)的響應(yīng)內(nèi)容為 404 Not found
③ 判斷用戶請求的是否為 / 或 /index.html 首頁
④ 判斷用戶請求的是否為 /about.html 關(guān)于頁面
⑤ 設(shè)置 Content-Type 響應(yīng)頭,防止中文亂碼
⑥ 使用 res.end() 把內(nèi)容響應(yīng)給客戶端
const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
// 1. 獲取請求的 url 地址
const url = req.url
// 2. 設(shè)置默認(rèn)的響應(yīng)內(nèi)容為 404 Not found
let content = '<h1>404 Not found!</h1>'
// 3. 判斷用戶請求的是否為 / 或 /index.html 首頁
// 4. 判斷用戶請求的是否為 /about.html 關(guān)于頁面
if (url === '/' || url === '/index.html') {
content = '<h1>首頁</h1>'
} else if (url === '/about.html') {
content = '<h1>關(guān)于頁面</h1>'
}
// 5. 設(shè)置 Content-Type 響應(yīng)頭,防止中文亂碼
res.setHeader('Content-Type', 'text/html; charset=utf-8')
// 6. 使用 res.end() 把內(nèi)容響應(yīng)給客戶端
res.end(content)
})
server.listen(80, () => {
console.log('server running at http://127.0.0.1')
})
案例 - 實(shí)現(xiàn) clock 時(shí)鐘的 web 服務(wù)器
1. 核心思路
把文件的實(shí)際存放路徑,作為每個(gè)資源的請求 url 地址。
2. 實(shí)現(xiàn)步驟
① 導(dǎo)入需要的模塊
② 創(chuàng)建基本的 web 服務(wù)器
③ 將資源的請求 url 地址映射為文件的存放路徑
④ 讀取文件內(nèi)容并響應(yīng)給客戶端
⑤ 優(yōu)化資源的請求路徑文章來源:http://www.zghlxwxcb.cn/news/detail-421437.html
// 1.1 導(dǎo)入 http 模塊
const http = require('http')
// 1.2 導(dǎo)入 fs 模塊
const fs = require('fs')
// 1.3 導(dǎo)入 path 模塊
const path = require('path')
// 2.1 創(chuàng)建 web 服務(wù)器
const server = http.createServer()
// 2.2 監(jiān)聽 web 服務(wù)器的 request 事件
server.on('request', (req, res) => {
// 3.1 獲取到客戶端請求的 URL 地址
// /clock/index.html
// /clock/index.css
// /clock/index.js
const url = req.url
// 3.2 把請求的 URL 地址映射為具體文件的存放路徑
// const fpath = path.join(__dirname, url)
// 5.1 預(yù)定義一個(gè)空白的文件存放路徑
let fpath = ''
if (url === '/') {
fpath = path.join(__dirname, './clock/index.html')
} else {
// /index.html
// /index.css
// /index.js
fpath = path.join(__dirname, '/clock', url)
}
// 4.1 根據(jù)“映射”過來的文件路徑讀取文件的內(nèi)容
fs.readFile(fpath, 'utf8', (err, dataStr) => {
// 4.2 讀取失敗,向客戶端響應(yīng)固定的“錯(cuò)誤消息”
if (err) return res.end('404 Not found.')
// 4.3 讀取成功,將讀取成功的內(nèi)容,響應(yīng)給客戶端
res.end(dataStr)
})
})
// 2.3 啟動(dòng)服務(wù)器
server.listen(80, () => {
console.log('server running at http://127.0.0.1')
})
文章來源地址http://www.zghlxwxcb.cn/news/detail-421437.html
到了這里,關(guān)于【NodeJs篇】http模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!