node.js http 模塊學習筆記

一個網站的加載流程粗略的流程大概以下:javascript

  1. 用戶經過瀏覽器發送一個http的請求到指定的主機html

  2. 服務器接收到該請求,對該請求進行分析和處理java

  3. 服務器處理完成之後,返回對應的數據到用戶機器node

  4. 瀏覽器接收服務器返回的數據,並根據接收到的進行分析和處理git

最簡單的web服務器

咱們須要搭建一個 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 對象

參數request對象是 http.IncomingMessage 的一個實例,經過它 ,咱們能夠獲取到此次請求的一些信息,好比頭信息,數據,url參數等等
這裏簡單的列一下最多見的:

  • httpVersion: 使用的http協議的版本

  • headers : 請求頭信息中的數據

  • url : 請求的地址

  • method : 請求方式

response 對象

參數 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處理,來實現的路由機制拉~

url 處理響應不一樣 html

固然這裏咱們再繼續深刻一下!結合 node 的文件系統(fs模塊),使不一樣的url,直接讀取不一樣的 html 文件,示例:

準備工做: 在當前文件目錄下創建html文件夾, 而且新增文件 index.htmluser.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模塊 的學習,理解有限,若是有錯誤之處,請指出,謝謝!

本文地址:https://guowenfh.github.io/2016/10/15/node-http/

相關文章
相關標籤/搜索