NodeJs簡明教程將從零開始學習NodeJs相關知識,助力JS開發者構建全棧開發技術棧!html
本文是NodeJs簡明教程的第三篇,將介紹NodeJs自帶HTTP模塊服務器相關的基本操做。node
如下是官方原文[1]:web
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.json
大體意思就是:瀏覽器
NodeJs的HTTP模塊旨在支持傳統上HTTP協議難以使用的許多功能,讓這些功能或者特性可以使用簡單的API進行調用。服務器
如下是NodeJs最簡單的HTTP服務器示例:app
新建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服務器已經啓動,若是啓動失敗,能夠在下方留言post
打開瀏覽器訪問 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請求對象,如下是經常使用的屬性或方法:
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來執行不一樣的邏輯須要開發者手動去作
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之路
公衆號得到持續更新以及在線答疑幫助。