http模塊
概念:
http
模塊的作用:
1、服務器和普通電腦的區別在於,服務器上安裝了 web
服務器軟件
2、我可可以基於 Node.js
提供的 http
模塊,通過幾行簡單的代碼,就能輕松的手寫一個服務器軟件,從而對外提供 web
服務
服務器相關的概念
ip
地址
-
IP 地址
就是互聯網上每台計算機的唯一地址,因此IP 地址
具有唯一性 -
IP 地址
的格式:通常用“點分十進制”表示成(a.b.c.d)
的形式,其中,a,b,c,d
都是 0~255 之間的十進制整數 -
例如:用點分十進表示的
IP
地址(192.168.1.1)
-
-
IP地址
和域名
是一一對應的關系,這份對應關系存放在一種叫做域名服務器(DNS,Domain name server)
的電腦中。使用者只需通過好記的域名訪問對應的服務器即可,對應的轉換工作由域名服務器實現。因此,域名服務器就是提供IP 地址
和域名之間的轉換服務的服務器
注意事項:
1. 單純使用 `IP 地址`,互聯網中的電腦也能夠正常工作。但是有了域名的加持,能讓互聯網的世界變得更加方便
2.在開發測試期間, 127.0.0.1
對應的域名是 localhost
,它們都代表我們自己的這台電腦,在使用效果上沒有任何區別
-
-
每個
web 服務
都對應一個唯一的端口號 -
客戶端發送過來的網絡請求,通過端口號,可以被准確地交給對應的
web 服務
進行處理
1 // 1. 導入 http 模塊 2 const http = require('http') 3 // 2. 創建 web 服務器實例 4 // 調用 http.createServer() 方法,即可快速創建一個 web 服務器實例 5 const server = http.createServer() 6 // 3. 為服務器實例綁定 request 事件 7 // 為服務器實例綁定 request 事件,即可監聽客戶端發送過來的網絡請求 8 // 使用服務器實例的 .on() 方法,為服務器綁定一個 request 事件 9 server.on('request', function (req, res) { 10 console.log('Someone visit our web server.') 11 }) 12 // 4.調用服務器實例的 .listen() 方法,即可啟動當前的 web 服務器實例 13 server.listen(8080, function () { 14 console.log('server running at http://127.0.0.1:8080') 15 })
1 const http = require('http') 2 const server = http.createServer() 3 // req 是請求對象,包含了與客戶端相關的數據和屬性 4 server.on('request', (req, res) => { 5 // req.url 是客戶端請求的 URL 地址 6 const url = req.url 7 // req.method 是客戶端請求的 method 類型 8 const method = req.method 9 const str = `Your request url is ${url}, and request method is ${method}` 10 console.log(str) 11 // 調用 res.end() 方法,向客戶端響應一些內容 12 res.end(str) 13 }) 14 server.listen(80, () => { 15 console.log('server running at http://127.0.0.1') 16 })
1 server.on('request', function (req, res) { 2 // res 是響應對象,它包含了與服務器相關的數據和屬性 3 // 例如:將字符串發送到客戶端 4 5 const str = `${req.url} -- ${req.method}` 6 7 // res.end() 方法的作用 8 // 向客戶端發送指定的內容,並結束這次請求的處理過程 9 res.end(str) 10 })
解決中文亂碼問題
1 const http = require('http') 2 const server = http.createServer() 3 4 server.on('request', (req, res) => { 5 // 定義一個字符串,包含中文的內容 6 const str = `您請求的 URL 地址是 ${req.url},請求的 method 類型為 ${req.method}` 7 // 調用 res.setHeader() 方法,設置 Content-Type 響應頭,解決中文亂碼的問題 8 res.setHeader('Content-Type', 'text/html; charset=utf-8') 9 // res.end() 將內容響應給客戶端 10 res.end(str) 11 }) 12 13 server.listen(80, () => { 14 console.log('server running at http://127.0.0.1') 15 })
核心實現步驟
-
獲取請求的
url
地址 -
設置默認的響應內容為
404 Not found
-
判斷用戶請求的是否為
/
或/index.html
首頁 -
判斷用戶請求的是否為
/about.html
關於頁面 -
設置
Content-Type
響應頭,防止中文亂碼 -
使用
res.end()
把內容響應給客戶端
1 const http = require('http') 2 const server = http.createServer() 3 4 server.on('request', (req, res) => { 5 // 1. 獲取請求的 url 地址 6 const url = req.url 7 // 2. 設置默認的響應內容為 404 Not found 8 let content = '<h1>404 Not found!</h1>' 9 // 3. 判斷用戶請求的是否為 / 或 /index.html 首頁 10 // 4. 判斷用戶請求的是否為 /about.html 關於頁面 11 if (url === '/' || url === '/index.html') { 12 content = '<h1>首頁</h1>' 13 } else if (url === '/about.html') { 14 content = '<h1>關於頁面</h1>' 15 } 16 // 5. 設置 Content-Type 響應頭,防止中文亂碼 17 res.setHeader('Content-Type', 'text/html; charset=utf-8') 18 // 6. 使用 res.end() 把內容響應給客戶端 19 res.end(content) 20 }) 21 22 server.listen(80, () => { 23 console.log('server running at http://127.0.0.1') 24 })
模塊化概念:
-
-
編程領域中的模塊化,就是遵守固定的規則,把一個大文件拆成獨立並互相依賴的多個小模塊
-
-
提高了代碼的復用性
-
提高了代碼的可維護性
-
可以實現按需加載
-
-
自定義模塊(用戶創建的每個
.js
文件,都是自定 義模塊) -
第三方模塊(由第三方開發出來的模塊,並非官方提供的內置模塊,也不是用戶創建的自定義模塊,使用前需要先下載)
1 // 1. 加載內置的 fs 模塊 2 const fs = require('fs') 3 4 // 2. 加載用戶的自定義模塊 5 const custom = require('./custom.js') 6 7 // 3. 加載第三方模塊,(使用第三方模塊,下面會進行講解) 8 const moment = require('moment')
1 // 被加載的模塊.js 2 3 const username = '張三' 4 5 function sayHello () { 6 console.log('說話') 7 }
1 // 加載模塊.js 2 3 const custom = require('./被加載的模塊')
-
-
外界用
require()
方法導入自定義模塊時,得到的就是module.exports
所指向的對象
1 // 記載模塊.js
2 const mo = require('./被加載的模塊')
4 console.log(mo) // {}
1 // 被加載的模塊.js 2 3 // 當外界使用 require 導入一個自定義模塊的時候,得到的成員,就是模塊中,通過 module.exports 指向的那個對象 4 // console.log('我會被加載')
1 const username = 'ifer'; 2 const sum = (a, b) => a + b; 3 4 // 最佳實踐,推薦寫法 5 module.exports = { 6 username, 7 sum 8 }; 9 10 /* // 往 module.exports 對象上掛載了一個屬性是一個字符串 11 module.exports.username = username; 12 13 // 往 module.exports 對象上掛載了一個屬性是一個方法 14 module.exports.sum = (a, b) => a + b; */
1 // require 得到的結果就是這個 sum.js 文件中 module.exports 所指向的對象 2 // ./ 一定不能省略,因為 sum.js 是一個自定義模塊 3 const modSum = require('./sum'); 4 5 const res = modSum.sum(1, 3); 6 console.log(res); // 4 7 8 // 這個 username 和引入的 sum.js 中的 username 沒有任何關系 9 const username = 'elser'; 10 11 console.log(username); // elser 12 console.log(modSum.username); // ifer
終端命令
node index.js
1 // 加載模塊.js 2 const mo = require('./被加載的模塊.js') 3 4 console.log(mo) // { username: '小黑', sayHi: [Function: sayHi] }
1 // 被加載模塊.js 2 3 // 當外界使用 require 導入一個自定義模塊的時候,得到的成員,就是模塊中,通過 module.exports 指向的那個對象 4 // console.log(module) 5 6 // 向 module.exports 對象上掛載 username 屬性 7 module.exports.username = 'zs' 8 9 // 向 module.exports 對象上掛載 sayHello 方法 10 module.exports.sayHello = function () { 11 console.log('Hellp') 12 } 13 14 // 使用 module.exports 指向一個全新的對象 15 module.exports = { 16 username: '小黑', 17 sayHi() { 18 console.log('小黑') 19 } 20 }
1 console.log(exports) 2 3 console.log(module.exports) 4 5 // 默認情況下,`exports` 和 `module.exports` 指向同一個對象 6 console.log(exports === module.exports) // true
1 // 將私有成員共享出去 2 exports.username = 'zs' 3 4 // 直接掛載方法 5 exports.sayHello = function () { 6 console.log('Hellp') 7 }
-
-
注意:為了防止混亂,建議大家不要在同一個模塊中同時使用
exports
和module.exports
1 exports.username = 'Tom' // 不會被打印 2 3 module.exports = { 4 gender: '男', 5 age: 22 6 } 7 8 module.exports.username = 'Tom' 9 10 // 不會被執行 11 exports = { 12 gender: '男', 13 age: 22 14 } 15 16 17 // 兩個都會執行 18 module.exports.username = 'Tom' 19 20 exports.gender = '男' 21 22 // 三個都會打印 23 exports = { 24 gender: '男', 25 age: 22 26 } 27 28 module.exports = exports 29 module.exports.username = 'Tom'
CommonJS
模塊化規范
-
Node.js
遵循了CommonJS
模塊化規范,CommonJS
規定了模塊的特性和各模塊之間如何相互依賴 -
CommonJS
規定: -
每個模塊內部,
module
變量代表當前模塊 -
module
變量是一個對象,它的exports
屬性(即module.exports
)是對外的接口 -
加載某個模塊,其實是加載該模塊的
module.exports
屬性。require() 方法用於加載模塊