node—http服務(wù)器模塊

HTTP模塊-服務(wù)器

  • 1.什么是HTTP模塊

    • 通過(guò)Nodejs提供的http模塊茧泪,我們可以快速的構(gòu)建一個(gè)web服務(wù)器,也就是快速實(shí)現(xiàn)過(guò)去PHP服務(wù)器的功能(接收瀏覽器請(qǐng)求甜熔、響應(yīng)瀏覽器請(qǐng)求等)
  • 2.通過(guò)HTTP模塊實(shí)現(xiàn)服務(wù)器功能步驟

    • 2.1導(dǎo)入HTTP模塊
    • 2.2創(chuàng)建服務(wù)器實(shí)例對(duì)象
    • 2.3綁定請(qǐng)求事件
    • 2.4監(jiān)聽(tīng)指定端口請(qǐng)求
let http = require("http");

// 1.創(chuàng)建一個(gè)服務(wù)器實(shí)例對(duì)象
let server = http.createServer();
// 2.注冊(cè)請(qǐng)求監(jiān)聽(tīng)
server.on("request", function (req, res) {
    // res.end("www.it666.com");  // 返回?cái)?shù)據(jù)是英文圆恤,則不需要寫下面那行
    res.writeHead(200, {
        "Content-Type": "text/plain; charset=utf-8"
    });
    res.end("微雙");
});
// 3.指定監(jiān)聽(tīng)的端口
server.listen(3000);
  • end方法的作用

    • 結(jié)束本次請(qǐng)求并且返回?cái)?shù)據(jù)
    • 上個(gè)示例中:res.end("微雙");
  • writeHead方法的作用

    • 告訴瀏覽器返回的數(shù)據(jù)是什么類型的,返回的數(shù)據(jù)需要用什么字符集來(lái)解析
    • 上個(gè)示例中:res.writeHead(200, {"Content-Type": "text/plain; charset=utf-8"});
web服務(wù)器簡(jiǎn)寫(鏈?zhǔn)骄幊?
  • 上個(gè)示例
let http = require('http');
http.createServer(function (req,res) {
    res.writeHead(200,{
        'Content-Type': 'text/plain;charset=utf-8'
    });
    res.end('微小雙');
}).listen(3000);

路徑分發(fā)

  • 1.什么是路徑分發(fā)?

    • 路徑分發(fā)也稱之為路由,就是根據(jù)不同的請(qǐng)求路徑返回不同的數(shù)據(jù)
  • 2.如何根據(jù)不同的請(qǐng)求路徑返回不同的數(shù)據(jù)?

    • 通過(guò)請(qǐng)求監(jiān)聽(tīng)方法中的request對(duì)象,我們可以獲取到當(dāng)前請(qǐng)求的路徑
      • request對(duì)象其實(shí)是http.IncomingMessage 類的實(shí)例
    • 通過(guò)判斷請(qǐng)求路徑的地址就可以實(shí)現(xiàn)不同的請(qǐng)求路徑返回不同的數(shù)據(jù)
//根據(jù)上個(gè)示例:
let http = require('http');
http.createServer(function (req,res) {
    res.writeHead(200,{
        'Content-Type': 'text/plain;charset=utf-8'
    });
    if(req.url.startsWith('/index')){
        res.end('首頁(yè)');
    }else if(req.url.startsWith('/login')){
        res.end('登錄');
    }else{
        res.end('沒(méi)有數(shù)據(jù)');
    }

}).listen(3000);
請(qǐng)求路徑多次返回?cái)?shù)據(jù)
  • response對(duì)象其實(shí)是http.ServerResponse 類的實(shí)例

  • res.write

    • write方法不具備結(jié)束本次請(qǐng)求的功能,所以還需要手動(dòng)的調(diào)用end方法來(lái)結(jié)束本次請(qǐng)求
  • ==注意點(diǎn)==

    • 如果通過(guò)end方法來(lái)返回?cái)?shù)據(jù),那么只會(huì)返回一次
    • 如果通過(guò)write方法來(lái)返回?cái)?shù)據(jù),那么可以返回多次
let http = require("http");

// 1.創(chuàng)建一個(gè)服務(wù)器實(shí)例對(duì)象
let server = http.createServer();
// 2.注冊(cè)請(qǐng)求監(jiān)聽(tīng)
server.on("request", function (req, res) {
    res.writeHead(200, {
        "Content-Type": "text/plain; charset=utf-8"
    });
    // console.log(req.url);
    if(req.url.startsWith("/index")){
        // res.end("首頁(yè)1");  // 只會(huì)返回首頁(yè)1
        // res.end("首頁(yè)2");    
        res.write("首頁(yè)1");
        res.write("首頁(yè)2");
        res.end(); 
    }else if(req.url.startsWith("/login")){
        res.end("登錄");
    }else{
        res.end("沒(méi)有數(shù)據(jù)");
    }
});
// 3.指定監(jiān)聽(tīng)的端口
server.listen(3000);

響應(yīng)完整頁(yè)面(返回靜態(tài)網(wǎng)頁(yè))

  • 示例(未優(yōu)化版)
let http = require('http');
let path = require('path');
let fs = require('fs');

let server = http.createServer();
server.on('request',function (req,res) {
    if(req.url.startsWith('/index')){
        let filePath = path.join(__dirname,'www','index.html');
        fs.readFile(filePath,'utf8',function (err,content) {
            if(err){
                res.end('Error');
            }
            res.end(content);
        })
    }else if(req.url.startsWith('/login')){
        let filePath = path.join(__dirname,'www','login.html');
        fs.readFile(filePath,'utf8',function (err,content) {
            if(err){
                res.end('Error');
            }
            res.end(content);
        })
    }else{
        res.end('No data');
    }
});
server.listen(3000);
  • 優(yōu)化版(未完成版,只適合text)

  • ==注意點(diǎn)==

    • 1.加載其它的資源不能寫utf8
    • 2.如果服務(wù)器在響應(yīng)數(shù)據(jù)的時(shí)候沒(méi)有指定響應(yīng)頭, 那么在有的瀏覽器上,響應(yīng)的數(shù)據(jù)有可能無(wú)法顯示
let http = require('http');
let path = require('path');
let fs = require('fs');

let server = http.createServer();
server.on('request',function (req, res) {
    readFile(req, res);
});
server.listen(3000);

function readFile(req, res) {
    let filePath = path.join(__dirname,'www',req.url);
    fs.readFile(filePath,'utf8',function (err,content) {
        if(err){
            res.end('Error');
        }
        res.end(content);
    });
}
響應(yīng)靜態(tài)資源
  • 響應(yīng)靜態(tài)資源

    • 在給瀏覽器返回?cái)?shù)據(jù)的時(shí)候,如果沒(méi)有指定響應(yīng)頭的信息,如果沒(méi)有設(shè)置返回?cái)?shù)據(jù)的類型,那么瀏覽器不一定能正確的解析
    • ==所以無(wú)論返回什么類型的靜態(tài)資源都需要添加對(duì)應(yīng)的響應(yīng)頭信息==
  • 優(yōu)化版(上節(jié)代碼終極版本腔稀,適用各種格式)

let http = require('http');
let path = require('path');
let fs = require('fs');
let mime = require('./mime.json');

let server = http.createServer();
server.on('request',function (req, res) {
    readFile(req, res);
});
server.listen(3000);

function readFile(req, res) {
    let filePath = path.join(__dirname, "www", req.url);
    let extName = path.extname(filePath);
    let type = mime[extName];
    if(type.startsWith("text")){
        type += "; charset=utf-8;";
    }
    res.writeHead(200, {
        "Content-Type": type
    });
    fs.readFile(filePath, function (err, content) {
        if(err){
            res.end("Server Error");
        }
        res.end(content);
    });
}
返回靜態(tài)資源封裝
let path = require('path');
let fs = require('fs');
let mime = require('./mime.json');  // 這個(gè)文件是封裝的各種格式

function readFile(req, res, rootPath) {
    let filePath = path.join(rootPath ,req.url);
    let extName = path.extname(filePath);
    let type = mime[extName];
    if(type.startsWith('text')){
        type += ';charset=uft-8;';
    }
    res.writeHead(200,{
        'Content-Type': type
    });
    fs.readFile(filePath,function (err,content) {
        if(err){
            res.end('Error');
        }
        res.end(content);
    });
}

exports.StaticServer = readFile;
  • 測(cè)試:
    • 上面封裝好代碼的調(diào)用示例(需要有一個(gè)名為www的文件夾盆昙,里面裝有測(cè)試文件)
let http = require('http');
let path = require('path');
let ss = require('./StaticServer.js');

let server = http.createServer();
server.on('request',function (req, res) {
    let rootPath = path.join(__dirname, 'www');
    ss.StaticServer(req, res, rootPath);
});
server.listen(3000);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市焊虏,隨后出現(xiàn)的幾起案子弱左,更是在濱河造成了極大的恐慌,老刑警劉巖炕淮,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異跳夭,居然都是意外死亡涂圆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門币叹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)润歉,“玉大人,你說(shuō)我怎么就攤上這事颈抚〔锐茫” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵贩汉,是天一觀的道長(zhǎng)驱富。 經(jīng)常有香客問(wèn)我,道長(zhǎng)匹舞,這世上最難降的妖魔是什么褐鸥? 我笑而不...
    開(kāi)封第一講書人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮赐稽,結(jié)果婚禮上叫榕,老公的妹妹穿的比我還像新娘。我一直安慰自己姊舵,他們只是感情好晰绎,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著括丁,像睡著了一般荞下。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,166評(píng)論 1 308
  • 那天锄弱,我揣著相機(jī)與錄音考蕾,去河邊找鬼。 笑死会宪,一個(gè)胖子當(dāng)著我的面吹牛肖卧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掸鹅,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼塞帐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了巍沙?” 一聲冷哼從身側(cè)響起葵姥,我...
    開(kāi)封第一講書人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎句携,沒(méi)想到半個(gè)月后榔幸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矮嫉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年削咆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蠢笋。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拨齐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出昨寞,到底是詐尸還是另有隱情瞻惋,我是刑警寧澤,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布援岩,位于F島的核電站歼狼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏享怀。R本人自食惡果不足惜蹂匹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凹蜈。 院中可真熱鬧限寞,春花似錦、人聲如沸仰坦。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)悄晃。三九已至玫霎,卻和暖如春凿滤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背庶近。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工翁脆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鼻种。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓反番,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親叉钥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罢缸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359