初學NODE 學習筆記(二)-常用內(nèi)置模塊

(二)用node.js內(nèi)置模塊,模擬搭建簡單服務器(靜態(tài)資源文件請求的處理);

明確:NODE是用來開發(fā)后臺,服務器端;

首先要知道服務器端都需要處理的事情 (一般可大致分以下四個)

  • 在服務器上創(chuàng)建一個服務(監(jiān)聽一個端口號)
  • 接收(解析)客戶端的請求信息
  • 找到客戶端需要的資源文件中的源代碼
  • 把源代碼返回

用到最基本的三個內(nèi)置模塊:HTTP、URL、FS

HTTP

這個模塊主要用于創(chuàng)建服務、監(jiān)聽端口、接收請求、返回內(nèi)容的管理

  • http.createServer : 創(chuàng)建一個服務,創(chuàng)建出來的服務默認遵循的是HTTP傳輸協(xié)議
  • ...
URL

這個模塊主要用來解析URL地址的

  • url.parse : 解析一個完整的URL(也可以不完整)中的每一項的
  • url...
FS

提供一些方法,供開發(fā)者進行I/O的操作

  • fs.readFileSync([pathname]):同步讀取指定文件中的內(nèi)容
  • fs.readFile([pathname],[callback]):異步讀取指定文件中的內(nèi)容

舉個通俗易的例子幫助理解同步讀取和異步讀取:
例如小明準備開始讀一本書《紅樓夢》,小明可能分兩種方式把這本書讀完:

  1. 在讀這本書的時候,小明規(guī)定自己不能走神,除了讀書什么都不能做,于是三天不吃不喝不睡不上廁所啥也不干的情況下,最后小明終于讀完了《紅樓夢》,讀完一瞬間小明 game over了;
  2. 在讀紅樓夢期間,小明決定每天看兩個小時,期間正常吃飯睡覺打豆豆,最終花了一個月讀完并且能倒背如流,然后準備開始讀《三國演義》;

方法**1 就類似是同步讀取書中的內(nèi)容,即 fs.readFileSync([pathname]):
方法
2 **就類似是異步讀取書中的內(nèi)容,即
fs.readFile([pathname],[callback])
此處的callback函數(shù) 就是讀完《紅樓夢》開始讀《三國》的動作

同步(sync): 一次就干一件事
異步(async): 干這件事的期間,下件事可以同時做

簡單模擬過程

var http = require('http'),
    url = require('url'),
    fs = require('fs');

var server = http.createServer(function (req, res) {
    console.log('ok');
})

server.listen(8080,function () {
    console.log('server is success,listening on 8080 port!'); 
// 當服務創(chuàng)建成功,并且端口號監(jiān)聽成功后,就會執(zhí)行這個回調(diào)函數(shù),一般會在這里面輸出一句話,提示創(chuàng)建成功 (此回調(diào)也可以不寫)不寫便不提示沒影響;
})

在瀏覽器中輸入以上地址向服務器發(fā)送請求:


在終端中顯示回調(diào)函數(shù)中自定義的語句,并且在瀏覽器中輸入地址發(fā)送請求后出現(xiàn)ok ,便說明已經(jīng)能與服務器建立連接;


建立連接成功后在服務器目錄下添加index.html , css/index.css和js/index.js文件, 并在里面隨意編寫一些內(nèi)容


需求是瀏覽器輸入地址發(fā)送請求后獲取到服務器端中的html、css及js文件;

//自行創(chuàng)建:(本例如下)
//index.html
<body>
<div> 一切美好事物從 'Hello World!'開始 </div>
</body>
// css/index.css
body{
    color: #fff;
}
// js/index.js
document.body.style.background = 'green';
//服務器端jiao'beserver1.js
var http = require('http'),
    url = require('url'),
    fs = require('fs');

var server = http.createServer(function (req, res) {
    console.log('ok');
    var urlObj = url.parse(req.url,true),
        pathname = urlObj.pathname,
        query = urlObj.query;
    if(pathname === '/index.html'){
        // 客戶端想要請求的就index.html,我們需要獲取這個文件中的源代碼(I/O),并且把源代碼返回
        var conFile = fs.readFileSync('./index.html')
        res.write(conFile);
        res.end();
    }
    if(pathname === '/css/index.css'){
        var conFile = fs.readFileSync('./css/index.css')
        res.end(conFile); //可以寫一起
    }
    if(pathname === '/js/index.js'){
        var conFile = fs.readFileSync('./js/index.js')
        res.end(conFile); 
    }
})

server.listen(8080,function () {
    console.log('server is success,listening on 8080 port!');
})

此時瀏覽器便會從服務器得到相關數(shù)據(jù),瀏覽器通過引擎渲染后顯示以下結(jié)果:

但以上的server1.js代碼存在以下問題還需要進一步優(yōu)化:

  1. 同時需要獲取更多個靜態(tài)資源(100個html)文件時,就不能用if逐個判斷了;
  2. 在客戶端向我們的服務發(fā)送請求的時候,谷歌瀏覽器會默認請求一個圖片'favicon.ico',但是我們的服務器上是沒有這張圖片;如果報錯會影響之后的數(shù)據(jù)請求;
  3. IE中不能渲染css文件的問題;

優(yōu)化代碼如下:

var http = require('http'),
    url = require('url'),
    fs = require('fs');
var server = http.createServer(function (req,res) {
    var urlObj = url.parse(req.url,true),
        pathname = urlObj.pathname,
        query = urlObj.query;
    /*
    * 靜態(tài)資源文件請求處理(HTML /CSS / JS / IMG / (PNG/JPG/GIF)/TXT...)
    * 所有的靜態(tài)資源文件都有一個共同的特征:都有后綴名,后綴名是由字母和數(shù)字組成的
    * 分析規(guī)律得到,服務器端需要查找文件的路徑地址只是在pathname前面加一個點即可;
    * 在IE中的問題 :服務器端返回給客戶端的都是字符串格式的數(shù)據(jù)不管是HTML/CSS/JS/....),
 對于谷歌瀏覽器來說,它比較智能,會自動識別當前代碼是什么類型的代碼,然后進行解析和渲染,但是IE這點不算智能,
 不能識別具體的文件類型,都當成字符串了;
 例:去商店買鹽,面粉,蘇打 三個白色的  google比較聰明能分辨各自是什么, ie分辨不出來只能在袋子上貼上標簽;
    * 解決方案: 需要我們在返回數(shù)據(jù)給客戶端的時候,制定當前文件的MIME類型,告訴IE是什么類型即可
    * MIME:
    * HTML - > text/html
    * CSS - > text/css
    * JS  ->  text/javascript
    * PNG ->  text/png
    *  .....
    * */

    var reg = /\.([0-9a-zA-Z]+)/i;     
    if(reg.test(pathname)){
        var conFile = null,
            status = 200;    
        try {
            conFile = fs.readFileSync('.'+pathname)
        }catch(e){
            conFile = 'not found~';
            status = 404;
        }
        // 根據(jù)當前請求資源文件的后綴名,計算出文件的MIME類型
        var suffix = reg.exec(pathname)[1].toUpperCase(),
            suffixMIME = 'text/plain';  //默認是純字符串文本
        switch(suffix){   // 根據(jù)具體項目需求添加
            case 'HTML':
                suffixMIME = 'text/html';
                break;
            case 'CSS':
                suffixMIME = 'text/css';
                break;
            case 'JS':
                suffixMIME = 'text/javascript';
                break;
        }
        //在返回數(shù)據(jù)內(nèi)容之前制定MIME類型 (重寫響應頭)
        res.writeHead(status,{
            'content-type':suffixMIME + ';charset=utf-8;'
        });
        res.end(conFile)
    }
})
server.listen(8080,function () {
   console.log('server is success,lisening on 8080 port!');
});

test:
http://localhost:8080/index.html
http://本機IP:8080/index.html
在PC瀏覽器中地址欄輸入以上test;頁面如下說明test ok!

同局域網(wǎng)環(huán)境下手機 test Ok!

差不多就這樣,如有異議,歡迎指正;

來碗湯,壓壓驚~~~

“要得到你必須付出,要付出你還要學會堅持,如果你真的覺得很難,那你就放棄,但是你放棄了就不要抱怨,我覺得人生就是這樣,世界真的是平衡的,每個人都是通過自己的努力,去決定自己生活的樣子” ---- 何炅

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內(nèi)容

  • 個人入門學習用筆記、不過多作為參考依據(jù)。如有錯誤歡迎斧正 目錄 簡書好像不支持錨點、復制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,486評論 1 37
  • Node.js是目前非常火熱的技術,但是它的誕生經(jīng)歷卻很奇特。 眾所周知,在Netscape設計出JavaScri...
    w_zhuan閱讀 3,626評論 2 41
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,356評論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,776評論 18 139
  • 搭建靜態(tài)資源服務器之node HTTP模塊 1. 代碼如下:const http = require('http...
    咚呱閱讀 470評論 0 0