本篇文章聊聊node的基礎(chǔ),關(guān)于http模塊及module.exports導(dǎo)出共享的理解和案例,希望對(duì)大家有所幫助!
一、http 模塊
http 模塊是 Node.js 官方提供的、用來創(chuàng)建 web 服務(wù)器的模塊。
通過 http 模塊提供的 http.createServer() 方法,就能方便的把一臺(tái)普通的電腦,變成一臺(tái) web 服務(wù)器,從而對(duì)外提供 web 資源服務(wù)。
1、創(chuàng)建 web 服務(wù)器
導(dǎo)入 http 模塊
創(chuàng)建 web 服務(wù)器實(shí)例
為服務(wù)器實(shí)例綁定 request 事件,監(jiān)聽客戶端的請(qǐng)求
啟動(dòng)服務(wù)器
示例:監(jiān)聽 8080 服務(wù)
// 導(dǎo)入 http 模塊 const http = require('http') // 創(chuàng)建 web 服務(wù)器實(shí)例 const server = http.createServer() // 為服務(wù)器實(shí)例綁定 request 事件 監(jiān)聽客戶端的請(qǐng)求 server.on('request', function (req, res) { console.log('請(qǐng)求中...') }) // 啟動(dòng)服務(wù) server.listen(8080, function () { console.log('http://127.0.0.1:8080') })
2、req 請(qǐng)求對(duì)象
只要服務(wù)器接收到了客戶端的請(qǐng)求,就會(huì)調(diào)用通過 server.on() 為服務(wù)器綁定的 request 事件處理函數(shù)
示例:在事件處理函數(shù)中,訪問與客戶端相關(guān)的數(shù)據(jù)或?qū)傩?/strong>
// 導(dǎo)入 http 模塊 const http = require('http') // 創(chuàng)建 web 服務(wù)器實(shí)例 const server = http.createServer() // req 是請(qǐng)求對(duì)象 包含了與客戶端相關(guān)的數(shù)據(jù)和屬性 server.on('request', (req) => { // req.url 客戶端請(qǐng)求的 url 地址 const url = req.url // req.method 是客戶端請(qǐng)求的 method 類型 const method = req.method const str = `Your request url is ${url} and request method is ${method}` console.log(str) }) // 啟動(dòng)服務(wù) server.listen(8080, function () { console.log('http://127.0.0.1:8080') })
3、res 響應(yīng)對(duì)象
在服務(wù)器的 request 事件處理函數(shù)中,如果想訪問與服務(wù)器相關(guān)的數(shù)據(jù)或?qū)傩裕枰褂?response
示例:請(qǐng)求響應(yīng)
// 導(dǎo)入 http 模塊 const http = require('http') // 創(chuàng)建 web 服務(wù)器實(shí)例 const server = http.createServer() // req 是請(qǐng)求對(duì)象 包含了與客戶端相關(guān)的數(shù)據(jù)和屬性 server.on('request', (req, res) => { // req.url 客戶端請(qǐng)求的 url 地址 const url = req.url // req.method 是客戶端請(qǐng)求的 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)容 res.end(str) }) // 啟動(dòng)服務(wù) server.listen(8080, function () { console.log('http://127.0.0.1:8080') })
4、解決中文亂碼問題
當(dāng)調(diào)用 res.end() 方法,向客戶端發(fā)送中文內(nèi)容時(shí),會(huì)出現(xiàn)亂碼問題,需要手動(dòng)設(shè)置內(nèi)容的編碼格式
示例:解決中文亂碼
// 導(dǎo)入 http 模塊 const http = require('http') // 創(chuàng)建 web 服務(wù)器實(shí)例 const server = http.createServer() // req 是請(qǐng)求對(duì)象 包含了與客戶端相關(guān)的數(shù)據(jù)和屬性 server.on('request', (req, res) => { // req.url 客戶端請(qǐng)求的 url 地址 const url = req.url // req.method 是客戶端請(qǐng)求的 method 類型 const method = req.method const str = `請(qǐng)求地址是 ${url} 請(qǐng)求方法是 ${method}` console.log(str) // 設(shè)置 Content-Type 響應(yīng)頭 解決中文亂碼問題 res.setHeader('Content-Type', 'text/html; charset=utf-8') // 調(diào)用 res.end() 方法 向客戶端響應(yīng)一些內(nèi)容 res.end(str) }) // 啟動(dòng)服務(wù) server.listen(8080, function () { console.log('http://127.0.0.1:8080') })
5、根據(jù)不同的 url 響應(yīng)不同的 html 內(nèi)容
示例:步驟如下
獲取請(qǐng)求的 url 地址
設(shè)置默認(rèn)的響應(yīng)內(nèi)容為 404 Not found
判斷用戶請(qǐng)求的是否為 / 或 /index.html 首頁
判斷用戶請(qǐng)求的是否為 /about.html 關(guān)于頁面
設(shè)置 Content-Type 響應(yīng)頭,防止中文亂碼
使用 res.end() 把內(nèi)容響應(yīng)給客戶端
// 導(dǎo)入 http 模塊 const http = require('http') // 創(chuàng)建 web 服務(wù)器實(shí)例 const server = http.createServer() // req 是請(qǐng)求對(duì)象 包含了與客戶端相關(guān)的數(shù)據(jù)和屬性 server.on('request', (req, res) => { // req.url 客戶端請(qǐng)求的 url 地址 const url = req.url // 設(shè)置默認(rèn)的內(nèi)容為 404 Not Found let content = '<h1>404 Not Found!</h1>' // 用戶請(qǐng)求頁是首頁 if(url === '/' || url === '/index.html') { content = '<h1>首頁</h1>' } else if (url === '/about.html') { content = '<h1>關(guān)于頁面</h1>' } // 設(shè)置 Content-Type 響應(yīng)頭 防止中文亂碼 res.setHeader('Content-Type', 'text/html; charset=utf-8') // 調(diào)用 res.end() 方法 向客戶端響應(yīng)一些內(nèi)容 res.end(content) }) // 啟動(dòng)服務(wù) server.listen(8080, function () { console.log('http://127.0.0.1:8080') })
二、Node.js 中的模塊分類
1、三大模塊分類
內(nèi)置模塊:由 node.js 官方提供的,如 fs、path、http 等
自定義模塊:用戶創(chuàng)建的每個(gè) .js 文件,都是自定義模塊
第三方模塊:由第三方開發(fā)出來的模塊,使用前要先下載
2、模塊作用域
防止了全局變量污染的問題
示例:
index.js 文件
const username = '張三' function say() { console.log(username); }
test.js 文件
const custom = require('./index') console.log(custom)
3、module.exports 對(duì)象
在自定義模塊中,可以使用 module.exports 對(duì)象,將模塊內(nèi)的成員共享出去,供外界使用。
外界 require() 方法導(dǎo)入自定義模塊時(shí),得到的就是 module.exports 所指向的對(duì)象
示例:
index.js 文件
const blog = '前端雜貨鋪' // 向 module.exports 對(duì)象上掛載屬性 module.exports.username = '李四' // 向 module.exports 對(duì)象上掛載方法 module.exports.sayHello = function () { console.log('Hello!') } module.exports.blog = blog
test.js 文件
const m = require('./index') console.log(m)
4、共享成員時(shí)的注意點(diǎn)
使用 require() 方法導(dǎo)入模塊時(shí),導(dǎo)入的結(jié)果,永遠(yuǎn)以 module.exports 指向的對(duì)象為準(zhǔn)
示例:
index.js 文件
module.exports.username = '李四' module.exports.sayHello = function () { console.log('Hello!') } // 讓 module.exports 指向一個(gè)新對(duì)象 module.exports = { nickname: '張三', sayHi() { console.log('Hi!') } }
test.js 文件
const m = require('./index') console.log(m)
5、exports 和 module.exports
默認(rèn)情況下,exports 和 module.exports 指向同一個(gè)對(duì)象。
最終共享的結(jié)果,還是以 module.exports 指向的對(duì)象為準(zhǔn)。
示例:
index1.js 文件
exports.username = '雜貨鋪' module.exports = { name: '前端雜貨鋪', age: 21 }
index2.js 文件
module.exports.username = 'zs' exports = { gender: '男', age: 22 }
index3.js 文件
exports.username = '雜貨鋪' module.exports.age = 21
index4.js 文件
exports = { gender: '男', age: 21 } module.exports = exports module.exports.username = 'zs'
對(duì) index2.js 文件結(jié)果的解析如下:
對(duì) index4.js 文件結(jié)果的解析如下:
注意:為防止混亂,盡量不要在同一個(gè)模塊中同時(shí)使用 exports 和 module.exports