node_04 基本模塊

HTTP協(xié)議

要理解Web服務(wù)器程序的工作原理笋鄙,首先,我們要對HTTP協(xié)議有基本的了解怪瓶。如果你對HTTP協(xié)議不太熟悉萧落,先看一看HTTP協(xié)議簡介

HTTP服務(wù)器

要開發(fā)HTTP服務(wù)器程序洗贰,從頭處理TCP連接找岖,解析HTTP是不現(xiàn)實(shí)的。這些工作實(shí)際上已經(jīng)由Node.js自帶的http模塊完成了敛滋。應(yīng)用程序并不直接和HTTP協(xié)議打交道许布,而是操作http模塊提供的\color{red}{request}(請求)和\color{red}{response}(響應(yīng))對象。

request對象封裝了HTTP請求绎晃,我們調(diào)用request對象的屬性和方法就可以拿到所有HTTP\color{red}{請求的信息}蜜唾;
response對象封裝了HTTP響應(yīng),我們操作response對象的方法庶艾,就可以把HTTP\color{red}{響應(yīng)}返回給瀏覽器袁余。

用Node.js實(shí)現(xiàn)一個(gè)HTTP服務(wù)器程序非常簡單。我們來實(shí)現(xiàn)一個(gè)\color{red}{最簡單的Web程序hello.js}咱揍,它對于所有請求泌霍,都返回Hello world!:

    'use strict'
    //導(dǎo)入http模塊
    var http = require('http');
    //創(chuàng)建http server,並傳入回調(diào)函數(shù);
    var server = http.createServer(function(request,response){

        console.log(request.methods + '6:7' + request.url);//回調(diào)函數(shù)接收request和response對象 獲得HTTP請求的methods和url:

        response.writeHead(200,{'Content-Type':'text/html'}); //將HTTP響應(yīng)200寫入response述召。同時(shí)設(shè)置Content-Type:text/html:
 
        response.end('<h1>Hello world!</h1>') //將HTTP響應(yīng)的Html內(nèi)容寫入response

    });

    server.listen(8000);// 讓服務(wù)器監(jiān)聽8080端口:

    console.log('Server is running at http://127.0.0.1:8000/')
index4.png

每次運(yùn)行瀏覽器,都會(huì)進(jìn)入兩次蟹地,因?yàn)闉g覽器默認(rèn)一次會(huì)請求favicon.ico积暖,如果這不符合我們的業(yè)務(wù)邏輯,就可以通過解析url怪与,當(dāng)請求icon時(shí)不做邏輯處理夺刑。


index4.png

文件服務(wù)器

\color{red}{url}
讓我們繼續(xù)擴(kuò)展一下上面的Web程序。我們可以設(shè)定一個(gè)目錄分别,然后讓W(xué)eb程序變成一個(gè)文件服務(wù)器遍愿。要實(shí)現(xiàn)這一點(diǎn),我們只需要解析request.url中的路徑耘斩,然后在本地找到對應(yīng)的文件沼填,把文件內(nèi)容發(fā)送出去就可以了。

解析URL需要用到Node.js提供的\color{red}{url模塊}括授,它使用起來非常簡單坞笙,通過\color{red}{parse()}將一個(gè)字符串解析為一個(gè)Url對象:

    'use strict';

    var url = require('url');

    console.log(url.parse('http://user:pass@host.com:8080/path/to/file?query=string#hash'));
index4.png

\color{red}{path}

    'use strict';
    var fs = require('fs')
    var path = require('path');

    // 解析當(dāng)前目錄:
    var workDir = path.resolve('.'); 
    console.log(workDir) // '/Users/mild/day/lianxi/jianshu-node'
    var filePath = path.join(workDir, 'save_new_excel.xls'); // '/Users/mild/day/lianxi/jianshu-node/save_new_excel.xls'
    // var filePath = path.join(workDir, 'pub','save_new_excel.xls'); // => '/Users/mild/day/lianxi/jianshu-node/pub/save_new_excel.xls'
    console.log(filePath)
    var data = fs.createReadStream(filePath)
    var ws  = fs.createWriteStream('testexc.xls')
    data.pipe(ws)

path獲取的是當(dāng)前的路徑岩饼,filePath獲取的是拼接好的文件路徑


最后,我們實(shí)現(xiàn)一個(gè)文件服務(wù)器index19.js:
\color{red}{腳本}(index19.js)

    'use strict';

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

    // 從命令行參數(shù)獲取root目錄薛夜,默認(rèn)是當(dāng)前目錄:
    var root = path.resolve(process.argv[2] || '.');
    //類似 '/Users/mild/day/lianxi/jianshu-node':

    console.log('Static root dir: ' + root);

    // 創(chuàng)建服務(wù)器:
    var server = http.createServer(function (request, response) {
        // 獲得URL的path籍茧,類似 '/node.text':
        var pathname = url.parse(request.url).pathname;
        // 獲得對應(yīng)的本地文件路徑,類似 '/Users/mild/day/lianxi/jianshu-node/node.text':
        var filepath = path.join(root, pathname); //當(dāng)前路徑拼接文件名 =>文件當(dāng)前路徑
        // 獲取文件狀態(tài):
        fs.stat(filepath, function (err, stats) {
            if (!err && stats.isFile()) {
                // 沒有出錯(cuò)并且文件存在:
                console.log('200 ' + request.url);
                // 發(fā)送200響應(yīng):
                response.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8;' });//<=響應(yīng)頭加utf-8
                // 將文件流導(dǎo)向response:
                fs.createReadStream(filepath).pipe(response);
            } else {
                // 出錯(cuò)了或者文件不存在:
                console.log('404 ' + request.url);
                // 發(fā)送404響應(yīng):
                response.writeHead(404);
                response.end('404 Not Found');
            }
        });
    });

    server.listen(8080);

    console.log('Server is running at http://127.0.0.1:8080/node.text');

\color{red}{腳本}(node.text)

我是node喲 adsfadsfa

index4.png

commoand + 點(diǎn)擊 http://127.0.0.1:8080/node.text

index5.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梯澜,一起剝皮案震驚了整個(gè)濱河市寞冯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晚伙,老刑警劉巖吮龄,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撬腾,居然都是意外死亡螟蝙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門民傻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胰默,“玉大人,你說我怎么就攤上這事漓踢∏J穑” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵喧半,是天一觀的道長奴迅。 經(jīng)常有香客問我,道長挺据,這世上最難降的妖魔是什么取具? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮扁耐,結(jié)果婚禮上暇检,老公的妹妹穿的比我還像新娘。我一直安慰自己婉称,他們只是感情好块仆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著王暗,像睡著了一般悔据。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俗壹,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天科汗,我揣著相機(jī)與錄音,去河邊找鬼绷雏。 笑死肛捍,一個(gè)胖子當(dāng)著我的面吹牛隐绵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拙毫,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼依许,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缀蹄?” 一聲冷哼從身側(cè)響起峭跳,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缺前,沒想到半個(gè)月后蛀醉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衅码,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年拯刁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逝段。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垛玻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奶躯,到底是詐尸還是另有隱情帚桩,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布嘹黔,位于F島的核電站账嚎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏儡蔓。R本人自食惡果不足惜郭蕉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喂江。 院中可真熱鬧恳不,春花似錦、人聲如沸开呐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筐付。三九已至,卻和暖如春阻肿,著一層夾襖步出監(jiān)牢的瞬間瓦戚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工丛塌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留较解,地道東北人畜疾。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像印衔,于是被迫代替她去往敵國和親啡捶。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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

  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,208評論 0 3
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,103評論 1 32
  • 內(nèi)容來自《Node.js開發(fā)指南》 核心模塊是 Node.js 的心臟奸焙,它由一些精簡而高效的庫組成狂票,為 Node....
    angelwgh閱讀 898評論 0 1
  • 個(gè)人入門學(xué)習(xí)用筆記拳昌、不過多作為參考依據(jù)。如有錯(cuò)誤歡迎斧正 目錄 簡書好像不支持錨點(diǎn)、復(fù)制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,472評論 1 37
  • 面試題一:https://github.com/jimuyouyou/node-interview-questio...
    R_X閱讀 1,623評論 0 5