在使用 Node.js 開發 網路應用的時候,大多使用框架,如 express、koa等,很少直接使用 http 模組來構建一個伺服器。這裡我們就具體實踐一下。
1、搭建一個簡單的http伺服器
// server.js
const http = require('http')
const server = http.createServer(function(req,res){
res.writeHead(200, { 'Content-Type' : 'text/plain'})
res.write('Hello world')
res.end()
})
server.listen(8000, function(){
console.log("Listening on port 8000")
})
複製程式碼
建立一個客戶端
// client.js
const http = require('http')
let options = {
port:8000
}
// 建立http請求
const req = http.request(options, function(res){
console.log('HTTP headers:', res.headers)
// 監聽請求的返回資料
res.on('data', function(chunk){
console.log('Body :', chunk.toString())
})
res.on('end', () => {
console.log('響應中已無資料。');
});
})
// 結束併傳送請求
req.end();
複製程式碼
執行上面 server.js 建立了一個 http 伺服器,執行 client.js 建立了一個 http 客戶端請求。
2、建立一個http代理伺服器
在服務端程式開法時,代理伺服器能做很多事情,如:快取檔案、壓縮檔案、廣告攔截、IP過濾等等。在生產環境,通常都是使用 nginx 來做代理伺服器。但是為了理解 http 模組的使用,這裡用 http 模組來建立一個代理伺服器。
根據例項1,可以看出 http.createServer 和 http.request 可以建立服務和傳送請求,所以,代理就可以使用這兩個方法來實現。
const http = require('http')
const url = require('url')
// 建立代理服務
const server = http.createServer(function(req,res){
console.log('開始請求:', req.url);
// TODO 可以通過構造 options來請求真正需要的地址
let options = url.parse(req.url);
options.headers = req.headers;
// 建立真實請求
const proxyReq = http.request(options, function(proxyRes){
// 監聽資料,返回給瀏覽器
proxyRes.on('data', function(chunk){
console.log('返回到代理的資料 :', chunk.toString())
//給原始請求,準備響應資料
res.write(chunk, 'binary');
})
// 監聽代理請求完成
proxyRes.on('end', function(){
console.log('代理結束')
// 響應完成
res.end();
});
// 傳送頭部資訊給瀏覽器
res.writeHead(proxyRes.statusCode, proxyRes.headers);
});
// 獲取從瀏覽器傳送到代理伺服器的資料
req.on('data',function(chunk){
console.log('請求資料大小:', chunk.length)
// 傳送代理請求
proxyReq.write(chunk, 'binary');
})
// 監聽原始請求結束
req.on('end',function(){
console.log('原始請求結束')
// 傳送代理請求
proxyReq.end();
})
})
// 啟動代理伺服器
server.listen(8000, function(){
console.log("代理服務啟動埠: 8000 ")
})
複製程式碼