一個網站的加載流程粗略的流程大概以下:javascript
用戶經過瀏覽器發送一個http的請求到指定的主機html
服務器接收到該請求,對該請求進行分析和處理java
服務器處理完成之後,返回對應的數據到用戶機器node
瀏覽器接收服務器返回的數據,並根據接收到的進行分析和處理git
咱們須要搭建一個 http
的服務器,用於處理用戶發送的 http
請求,在 node 中有 http
核心模塊能夠在很簡單的幾句話就幫咱們啓動一個服務器。github
// 導入http模塊: var http = require('http'); // 建立http server,並傳入回調函數: var server = http.createServer(function (request, response) { // 回調函數接收request和response對象, console.log('有客戶端請求了.....'); // 將HTTP響應200寫入response, 同時設置Content-Type: text/html: response.writeHead(200, {'Content-Type': 'text/html'}); // 將HTTP響應的HTML內容寫入response: response.write('<h1>hello World!</h1>'); response.end(); }); // 讓服務器監聽8888端口: server.listen(8888); console.log('Server is running at http://127.0.0.1:8888/');
就這幾行代碼,咱們就搭建了一個簡單服務器,當咱們將其運行,訪問地址能在瀏覽器中顯示咱們熟悉的 hello World!
,邁出了第一步。web
下面咱們來看看幾個重要的地方:api
首先咱們來看建立http server
的代碼:數組
var server = http.createServer([requestListener])
:建立並返回一個HTTP服務器對象瀏覽器
requestListener
: 監聽到客戶端鏈接的回調函數
在這裏能夠看到咱們的回調函數是可選的,咱們還可使用事件監聽器來進行,監聽到客戶端鏈接以後的操做,如:
server.on('request', function(req, res) {// do ....})
咱們要在用戶訪問時作一些什麼,都會在這裏。
再看監聽端口的代碼,在這裏咱們只是簡單的寫了一下監聽的端口,它的可選項都沒有去設置
server.listen(port, [hostname], [backlog], [callback])
:監聽客戶端鏈接請求,只有當調用了 listen
方法之後,服務器纔開始工做
port
: 監聽的端口
hostname
: 主機名(IP/域名),可選
backlog
: 鏈接等待隊列的最大長度,可選
callback
: 調用listen方法併成功開啓監聽之後,會觸發一個 listening事件,callback將做爲該事件的執行函數,可選
看完了建立與監聽的方法,咱們再看看看,咱們在監聽到客戶端鏈接的回調函數 server.on('request', function(req, res) {// do ....})
中看到有兩個參數 request 和 response ,
在這兩個參數中,咱們能夠去得到用戶的當前請求一些信息,好比頭信息,數據等待,還能夠向該次請求的客戶端輸出返回響應,下面咱們一塊兒看看它裏面的內容
參數request
對象是 http.IncomingMessage
的一個實例,經過它 ,咱們能夠獲取到此次請求的一些信息,好比頭信息,數據,url
參數等等
這裏簡單的列一下最多見的:
httpVersion
: 使用的http協議的版本
headers
: 請求頭信息中的數據
url
: 請求的地址
method
: 請求方式
參數 response
對象是 http.ServerResponse
(這是一個由HTTP服務器內部建立的對象) 的一個實例,經過它 咱們能夠向該次請求的客戶端輸出返回響應。
response.writeHead(statusCode, [reasonPhrase], [headers])
:向請求回覆響應頭,這個方法只能在當前請求中使用一次,而且必須在response.end()
以前調用。
statusCode
: 一個三位數的HTTP狀態碼, 例如 404
reasonPhrase
:自行設置http響應狀態碼對應的緣由短語
headers
:響應頭的內容
write(chunk, [encoding])
: 發送一個數據塊到響應正文中 ,若是這個方法被調用可是 response.writeHead()
沒有被調用,
它將切換到默認header模式並更新默認的headers。chunk能夠是字符串或者緩存。若是chunk 是一個字符串,
第二個參數代表如何將這個字符串編碼爲一個比特流。默認的 encoding是'utf8'。
end([data], [encoding])
: 當全部的正文和頭信息發送完成之後,調用該方法告訴服務器數據已經所有發送完成了。
這個方法在每次完成信息發送之後必須調用,而且是最後調用,若是指定了參數 data , 就至關於先調用 response.write(data, encoding)
以後再調用 response.end()
setHeader(name, value)
: 爲默認或者已存在的頭設置一條單獨的頭信息:若是這個頭已經存在於 將被送出的頭中,將會覆蓋原來的內容。若是我想設置更多的頭, 就使用一個相同名字的字符串數組
如:response.setHeader("Set-Cookie", ["type=ninja", "language=javascript"]);
看了那麼多api,是時候實踐一把了,咱們再來對原來的代碼進行一點改造~
// 導入http模塊,url 模塊 var http = require('http'); var url = require('url') // 建立http server var server = http.createServer(); server.on('request', function (req, res) { // 將HTTP響應200寫入response, 同時設置Content-Type: text/html: res.writeHead(200, { 'Content-Type': 'text/html' }); var urlObj = url.parse(req.url); //根據用戶訪問的url不一樣展現不一樣的頁面 switch (urlObj.pathname){ // 這是首頁 case '/': res.write('<h1>這是裏首頁</h1>'); break; case '/user': res.write('<h1>這裏是我的中心</h1>'); break; default : res.write('<h1>你要找的頁面不見了~</h1>'); break; } // 將HTTP響應的HTML內容寫入response: res.end(); }); server.listen(8888); console.log('Server is running at http://127.0.0.1:8888/');
啓動一下該js文件,而且經過不一樣的url不一樣的後綴,如 /
和 /user
去訪問這個地址,看看瀏覽器的輸出,應該已經變了。
這就是經過簡單的的url處理,來實現的路由機制拉~
固然這裏咱們再繼續深刻一下!結合 node 的文件系統(fs模塊),使不一樣的url,直接讀取不一樣的 html 文件,示例:
準備工做: 在當前文件目錄下創建html
文件夾, 而且新增文件 index.html
與 user.html
,內容自行發揮
var http = require('http'); var url = require('url'); var fs = require('fs'); var server = http.createServer(); // 讀取咱們當前文件所在的目錄下的 html 文件夾 var HtmlDir = __dirname + '/html/'; server.on('request', function(req, res) { var urlObj = url.parse(req.url); switch (urlObj.pathname) { case '/': //首頁 sendData(HtmlDir + 'index.html', req, res); break; case '/user': //用戶首頁 sendData(HtmlDir + 'user.html', req, res); break; default: //處理其餘狀況 sendData(HtmlDir + 'err.html', req, res); break; } }); /** * 讀取html文件,響應數據,發送給瀏覽器 * @param {String} file 文件路徑 * @param {Object} req request * @param {Object} res response 對象 */ function sendData(file, req, res) { fs.readFile(file, function(err, data) { if (err) { res.writeHead(404, { 'content-type': 'text/html;charset=utf-8' }); res.end('<h1>你要找的頁面不見了~</h1>'); } else { res.writeHead(200, { 'content-type': 'text/html;charset=utf-8' }); res.end(data); } }); } server.listen(8888); console.log('Server is running at http://127.0.0.1:8888/');
運行文件,切換url,程序會將不一樣的頁面返回。你們本身去試試吧!
這是對於 node 的 http模塊 的學習,理解有限,若是有錯誤之處,請指出,謝謝!