用 Nodejs 實現(xiàn) Http 服務(wù)版本的 Hello world
大家好,我是前端西瓜哥,今天我們來學(xué)習(xí) nodejs,用 nodejs 寫一個簡單 http 服務(wù)版本的 "hello world"。
http.createServer
我們需要用到 nodejs 的 http 模塊。
http 模塊包含了和 http 相關(guān)的一些方法,我們需要用到 http.createServer 方法,它用于創(chuàng)建一個 http 服務(wù),并返回 http.Server 實例對象。
http.createServer 方法接受兩個參數(shù):
- 配置對象 options,可選。比如可以配置請求超時時間 requestTimeout。
- 監(jiān)聽請求函數(shù),可選。當接收到請求時,我們可以通過該函數(shù)拿到請求對象 req 和響應(yīng)對象 res。req 是http.IncomingMessage 實例對象,res 則是 http.ServerResponse 實例對象, http.ServerResponse 繼承自 http.OutgoingMessage 類。
然后返回一個 http.Server 實例對象,http.Server 繼承自 net.Server。
http 模塊涉及相當多的類,需要注意區(qū)分。
對于 req 請求對象,我們可以拿到請求內(nèi)容,比如:
- req.headers :對象形式的請求頭字段(key 會轉(zhuǎn)換為小寫)。
- req.method:請求方法,如 "Get"。
對于 res 響應(yīng)對象,我們可以通過它來設(shè)置響應(yīng)信息,比如:
- res.writeHead:writeHead 方法用于設(shè)置狀態(tài)碼(如 200)、狀態(tài)消息(如 "OK")以及響應(yīng)頭字段。主要注意的是,有些頭字段是 nodejs 自己加的,比如 date。
- res.setHeader:設(shè)置單個響應(yīng)頭字段,但必須在 res.writeHead 前執(zhí)行。
- res.getHeaders:返回最終設(shè)置出來的響應(yīng)頭對象,可用于調(diào)試。
- res.write:設(shè)置響應(yīng)體內(nèi)容、編碼類型,可以多次調(diào)用,新內(nèi)容會接到末尾。
- res.end:該方法表示響應(yīng)頭和請求體已經(jīng)設(shè)置完成,響應(yīng)就會發(fā)出去,這個方法是必須要調(diào)用的??梢詡魅雰?nèi)容參數(shù)設(shè)置響應(yīng)體,相當于順手再做了一下 res.write 的工作。
然后是 http.createServer 返回的 http.Server 實例對象。它用于控制了這個特定 http 服務(wù),比如:
- server.close :該方法可以關(guān)閉當前 http 服務(wù)。具體是先不再接受新的請求,然后正在處理的請求都處理完后,才真正關(guān)閉,并觸發(fā) close 事件。
- server.listen:監(jiān)聽請求連接,常見的用法是指定一個端口號。
Hello World!
現(xiàn)在我們來實現(xiàn)一個會返回 Hello World! 的 http 服務(wù)。
很簡單。我們先用 http.createServer 創(chuàng)建一個 http 服務(wù)。
傳入一個請求函數(shù),這個函數(shù)會在發(fā)生請求時拿到 res 響應(yīng)對象,然后使用 res.writeHead 設(shè)置狀態(tài)碼 200,以及必要的頭字段。
我們返回的數(shù)據(jù)是純文本類型,所以設(shè)置 Content-Type 為 'text/plain'。這個需要根據(jù)你自己的需求選擇 MIME,比如 HTML 用 text/html。
然后用 res.end 表示設(shè)置完成,并帶上 'Hello World!\n' 作為請求體。
最后我們給 http.createServer 方法返回的對象執(zhí)行 listen 方法,監(jiān)聽 3200 端口。
然后我們訪問 http://localhost:3200/,就能看到 Hello World! 了。
結(jié)尾
Nodejs 提供了 http 模塊,可以讓我們比較便捷地創(chuàng)建 http 服務(wù),但因為涉及到的類和 API 也比較多,所以實際上更多會使用封裝后的Web 框架,比如 Express、Nestjs。