NodeJs簡明教程將從零開始學習NodeJs相關知識,助力JS開發者構建全棧開發技術棧!
本文是NodeJs簡明教程的第三篇,將介紹NodeJs自帶HTTP模塊服務器相關的基本操做。html
如下是官方原文[1]:node
The HTTP interfaces in Node.js are designed to support many features of the protocol which have been traditionally difficult to use. In particular, large, possibly chunk-encoded, messages. The interface is careful to never buffer entire requests or responses — the user is able to stream data.
大體意思就是:web
NodeJs的HTTP模塊旨在支持傳統上HTTP協議難以使用的許多功能,讓這些功能或者特性可以使用簡單的API進行調用。
如下是NodeJs最簡單的HTTP服務器示例:json
index.js
編碼瀏覽器
const http = require('http'); const server = http.createServer((req, res) => { console.log('%s %s', req.method, req.url) res.end(JSON.stringify(req.headers)) }) server.listen(8080, () => console.log('listen on 8080'))
node index.js
,終端或控制檯會輸出listen on 8080
,此時HTTP服務器已經啓動,若是啓動失敗,能夠在下方留言打開瀏覽器訪問 http://localhost:8080
,筆者輸出以下:服務器
{ "host": "localhost:8080", "connection": "keep-alive", "cache-control": "max-age=0", "upgrade-insecure-requests": "1", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36", "dnt": "1", "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", "accept-encoding": "gzip, deflate, br", "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7", }
http.createServer
函數建立了一個 HTTP服務器,並配置了請求回調函數,在本系列的第一篇文章中說到事件驅動是須要回調函數進行監聽的。server.listen
是監聽系統端口,第二個參數是監聽成功的回調函數 服務器收到的HTTP請求對象,如下是經常使用的屬性或方法:app
req.url
本次請求的路徑(不包含域名)req.headers
本次請求的請求頭req.httpVersion
本次請求的HTTP協議版本號
req.method
本次請求的請求方法,有GET/POST/PUT等等
on()
監聽請求體數據 POST/PUT/PATCH
方法會有請求體res對象是req請求對象相應的響應對象,HTTP協議設計是請求-應答
模型,一次請求對應一次應答。框架
如下是經常使用的屬性或方法:函數
res.writeHead
輸出響應狀態碼
,狀態碼說明
以及多個HTTP響應頭
res.end
輸出數據並結束本次響應res.write
輸出部份內容(chunk)
res.setHeader
輸出單個響應頭
NodeJs自帶的HTTP服務器是沒有路由功能的,也是就說,根據請求的URI來執行不一樣的邏輯須要開發者手動去作post
const http = require('http'); const server = http.createServer((req, res) => { if (req.url === '/') { res.end('index'); return; } if (req.url === '/user') { res.end('user'); return; } }) server.listen(8080, () => console.log('listen on 8080'));
node index.js
index
user
const http = require('http'); const url = require('url'); const qs = require('querystring'); const server = http.createServer((req, res) => { const parsed = url.parse(req.url); const query = qs.parse(parsed.query); res.end(JSON.stringify(query)); }) server.listen(8080, () => console.log('listen on 8080'));
node index.js
顯示
{ "a": "x", "b": "2", "c[]": ["1", "2"] }
HTTP協議規範中POST/PUT/PATCH均可以攜帶請求體,NodeJs HTTP服務器接收請求體代碼以下:
const http = require('http'); const url = require('url'); const qs = require('querystring'); const server = http.createServer((req, res) => { let data = Buffer.alloc(0); req.on('data', (buffer) => { data = Buffer.concat([data, buffer]); }) req.on('end', () => { res.end(data.toString()) }) }) server.listen(8080, () => console.log('listen on 8080'));
node index.js
http://localhost:8080
,本例POST請求體爲 a=1&b=2
a=1&b=2
一個簡單的HTTP服務器就到此結束了,固然,實際生產中該方法用的比較少,幾乎都是使用框架進行開發,提升開發效率。
歡迎關注Nodejs之路
公衆號得到持續更新以及在線答疑幫助。