Node.js基本模塊操作及搭建http服務(wù)器

1.基本模塊使用

使用不同的模塊可以登錄Node官網(wǎng),查詢文檔翅睛,找到對(duì)應(yīng)的模塊及使用方法。
每次新建項(xiàng)目,都得重新安裝需要的模塊

(1) 讀寫 文件:

需要引入process模塊僻焚,并使用其中的 fs模塊,再調(diào)用writeFile()readFile()方法
① 引入process模塊 則需安裝此模塊:npm install process
② 在調(diào)用其fs模塊,則需引入:fs = require('fs');
writeFile()參數(shù):

  • 寫入文件的路徑(已存在文件則直接寫入膝擂,不存在則新建)
  • 寫入文件的內(nèi)容
  • 寫入文件的編碼形式(可選)
  • 回調(diào)函數(shù) function(err){ err === null 則寫入成功虑啤,否則失敗}

readFile()參數(shù):

  • 讀取文件的路徑
  • 讀取文件的編碼形式(可選參數(shù),如果不傳猿挚,則得到的是一個(gè)Buffer對(duì)象咐旧,如果想要得到字符串驶鹉,則可調(diào)用data.toString()方法绩蜻,此方法的默認(rèn)參數(shù)是utf-8,當(dāng)然也可以直接傳入?yún)?shù)utf-8室埋,則得到的直接是字符串办绝,無(wú)需轉(zhuǎn)換)
  • 回調(diào)函數(shù) function(err ,data){ if(err) { throw err} else{ //body...} }伊约,讀取到的數(shù)據(jù)則是data

⑥實(shí)例:

/*寫入文件*/
let message = 'hello world';
fs.writeFile("./hello",message,'utf8',function (err) {
   if(err){
       //若err === null 則文件寫入成功;err !== null 則寫入失敗
       console.log("出錯(cuò)啦!")
   }
});
/*讀取文件*/
fs.readFile('./hello','utf8',function (err,data) {
    if(err){
        throw err;
    }
    else
        console.log(data); //輸出讀取到的內(nèi)容
});
(2) 獲取路徑:

要了解__filename__dirname孕蝉,為了更方便要引入path模塊進(jìn)行路徑拼接
安裝引入模塊與上述相同
__filename:表示當(dāng)前執(zhí)行的js文件的完整路徑
__dirname:表示當(dāng)前執(zhí)行的js文件的目錄
eg:打印上述例子的 data ,__filename__dirname

image.png

②引入path模塊進(jìn)行路徑拼接

  • 調(diào)用其path.join()方法屡律,此方法有無(wú)數(shù)個(gè)參數(shù),但是前一項(xiàng)為后一項(xiàng)的父目錄
    eg:const filename = path.join(__dirname,"hello");//得到的則是hello文本文件的完整路徑
(3)搭建http服務(wù)器(分解方法)

需要了解服務(wù)器執(zhí)行的過(guò)程降淮,引入http模塊超埋,監(jiān)聽(tīng)請(qǐng)求事件,并作出響應(yīng)
①引入http模塊 方法同上 http = require('http')
②新建http對(duì)象 const serve = http.createServer();
③監(jiān)聽(tīng)用戶請(qǐng)求事件 server.on( 'request' ,function(request , response){...})

  • request對(duì)象:用戶請(qǐng)求報(bào)文的內(nèi)容佳鳖,解析請(qǐng)求報(bào)文霍殴,獲取用戶提交的數(shù)據(jù)
  • response對(duì)象:返回響應(yīng)報(bào)文,服務(wù)器向?yàn)g覽器響應(yīng)數(shù)據(jù)
  • request與response對(duì)象就是對(duì)應(yīng) 提交請(qǐng)求(數(shù)據(jù)) 和 返回響應(yīng)(數(shù)據(jù))

④監(jiān)聽(tīng)事件得到用戶的請(qǐng)求系吩,則對(duì)請(qǐng)求必須作出響應(yīng):response.write("響應(yīng)內(nèi)容")来庭;
其中,還有針對(duì)請(qǐng)求穿挨,返回響應(yīng)時(shí)瀏覽器解析方式,瀏覽器可以直接解析英文月弛,中文就會(huì)亂碼。
所以對(duì)于不同的資源有不同的解析方式(Content-Type)需要進(jìn)行設(shè)置響應(yīng)報(bào)文頭response.setHeader('Content-Type','.....')科盛。
設(shè)置報(bào)文頭得寫在響應(yīng)內(nèi)容之前
事件最后每個(gè)請(qǐng)求的響應(yīng)都要有結(jié)束帽衙,不然瀏覽器會(huì)一直等待結(jié)束 :
response.end(),可以返回?cái)?shù)據(jù)作為結(jié)束
④啟動(dòng)服務(wù)器 server.listen(8080,function(){ console.log("可訪問(wèn):http://localhost:8080)})

2.搭建http服務(wù)器

上述模塊中的 http模塊中已經(jīng)差不多介紹清楚了如何搭建土涝,但是針對(duì)不同的請(qǐng)求佛寿,作出不同響應(yīng)還得細(xì)說(shuō)但壮,響應(yīng)的是文本弹渔,圖片焦辅,還是整個(gè)html頁(yè)面

  • 先來(lái)看如何搭建的代碼(分解步驟):
//1.加載http模塊
const http = require("http");
//2.創(chuàng)建一個(gè)http服務(wù)對(duì)象
const server = http.createServer();
//3.監(jiān)聽(tīng)用戶的請(qǐng)求事件(request事件)
server.on('request',function (request,response) {
    response.setHeader('Content-Type','text/html;charset=utf-8'); //解析方式,針對(duì)文本和HTML頁(yè)面
    response.write("hello world,歡迎來(lái)到<h3>我的世界</h3>");
    response.end();
});
//4.啟動(dòng)服務(wù)器
server.listen(8080,function () {
   console.log("服務(wù)器啟動(dòng)了廉油,請(qǐng)?jiān)L問(wèn)http://localhost:8080");
});
  • 簡(jiǎn)寫步驟:
const http = require("http");
http.createServer(function (request,response) {
    response.write("hello world,歡迎來(lái)到<h3>我的世界</h3>");
    response.end();
}).listen(8080,function () {
    console.log("服務(wù)器已開(kāi)啟,請(qǐng)?jiān)L問(wèn):http://localhost:8080");

這只是搭建,下來(lái)對(duì)于響應(yīng),上述代碼中,是對(duì)所有的請(qǐng)求都回應(yīng)hello world。

  • 不同響應(yīng)就要結(jié)合上面所介紹的不同模塊的操作了:讀取頁(yè)面路徑,拼接路徑
  • 要用到request.url得到請(qǐng)求的路徑姓赤,但是要明確url只是一個(gè)瀏覽器的標(biāo)識(shí)符,來(lái)區(qū)別訪問(wèn)的具體哪個(gè)。
  • 請(qǐng)求訪問(wèn)不同的頁(yè)面: 需要有不同的html文件毕谴,然后判斷request.url進(jìn)行不同的響應(yīng)
http.createServer(function (request,response) {
    //如果用戶請(qǐng)求的是html頁(yè)面
    if(request.url === '/'|| request.url === "/index"){
        //響應(yīng)不同的頁(yè)面,就要讀取頁(yè)面的存儲(chǔ)路徑
        fs.readFile(path.join(__dirname,'htmls','index.html'),function (err,data) {
            if(err){
                throw err;
            }
            response.end(data);
        });
    }else if(request.url === '/login'){
        fs.readFile(path.join(__dirname,'htmls','login.html'),function (err,data) {
            if(err){
                throw err;
            }
            response.end(data);
        });
    }

  • 如果用戶請(qǐng)求的是圖片 更改判斷的request.url
    else if(request.url === "/image/xiaoben.jpg"){
        fs.readFile(path.join(__dirname,'image','xiaoben.jpg'),function (err,data) {
            if(err){
                throw err;
            }
            response.setHeader('Content-Type','image/jpg');
            response.end(data);
        });
    }
  • 如果請(qǐng)求的是css
    else if(request.url === "/css/index.css"){
        fs.readFile(path.join(__dirname,'css','index.css'),function (err,data) {
            if(err){
                throw err;
            }
            response.setHeader('Content-Type','text/css');
            response.end(data);
        });
    }
}).listen(9090,function () {
   console.log("請(qǐng)?jiān)L問(wèn):http://localhost:9090");
});

上述方法看起來(lái)很累贅,因?yàn)橐?strong>不僅要對(duì)路徑進(jìn)行判斷,還有設(shè)置對(duì)應(yīng)的解析方式析珊,這樣的做法太麻煩,所以有更簡(jiǎn)單的方法哇,就要學(xué)習(xí)接下來(lái)的mime模塊了


搭建http服務(wù)器的終極版本

重點(diǎn):
①引入mime模塊蔑穴,getType()方法得到每次請(qǐng)求的不同資源對(duì)應(yīng)的Content-Type的類型

response.setHeader('Content-Type',mime.getType(filename));
②拼接路徑:當(dāng)前js文件執(zhí)行的目錄+ 文件夾名+請(qǐng)求路徑
將要請(qǐng)求的靜態(tài)資源放入一個(gè)文件夾public忠寻,啟動(dòng)服務(wù)器則自動(dòng)響應(yīng)(模擬Apache服務(wù)`器)

const http = require('http');
const path = require('path');
const fs = require('fs');
const mime = require('mime');
http.createServer(function (request,response) {
    //得到public的完整路徑
    let publicURL = path.join(__dirname,'public');
    //得到public下請(qǐng)求的具體完整絕對(duì)路徑
    let filename = path.join(publicURL,request.url);
    //讀取響應(yīng)內(nèi)容
    fs.readFile(filename,function (err,data) {
       if(err){
           response.end("文件不存在");
       }
       else{
            response.setHeader('Content-Type',mime.getType(filename)); 
           //getType方法得到 對(duì)應(yīng)的Content-Type的類型
           //找到文件則返回文件資源
           response.end(data);
       }
    })
}).listen(8080,function () {
   console.log("http://localhost:8080");
});

這樣就可以直接訪問(wèn)public中的內(nèi)容了,
eg: http://localhost:8080/index.html

image.png

或者 http://localhost:8080/image/1.jpg 等都可以得到響應(yīng)存和。

image.png


今天先學(xué)習(xí)到這了奕剃。
人的一生,十之八九不如意捐腿。

行到水窮處纵朋,坐看云起時(shí)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茄袖,隨后出現(xiàn)的幾起案子操软,更是在濱河造成了極大的恐慌,老刑警劉巖宪祥,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聂薪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蝗羊,警方通過(guò)查閱死者的電腦和手機(jī)藏澳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)耀找,“玉大人翔悠,你說(shuō)我怎么就攤上這事∫懊ⅲ” “怎么了蓄愁?”我有些...
    開(kāi)封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)狞悲。 經(jīng)常有香客問(wèn)我涝登,道長(zhǎng),這世上最難降的妖魔是什么效诅? 我笑而不...
    開(kāi)封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任胀滚,我火速辦了婚禮,結(jié)果婚禮上乱投,老公的妹妹穿的比我還像新娘咽笼。我一直安慰自己,他們只是感情好戚炫,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布剑刑。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪施掏。 梳的紋絲不亂的頭發(fā)上钮惠,一...
    開(kāi)封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音七芭,去河邊找鬼素挽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狸驳,可吹牛的內(nèi)容都是我干的预明。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼耙箍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼撰糠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起辩昆,我...
    開(kāi)封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阅酪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后汁针,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遮斥,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年扇丛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了术吗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帆精,死狀恐怖较屿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卓练,我是刑警寧澤隘蝎,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站襟企,受9級(jí)特大地震影響嘱么,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜顽悼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一曼振、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔚龙,春花似錦冰评、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)解孙。三九已至,卻和暖如春抛人,著一層夾襖步出監(jiān)牢的瞬間弛姜,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工妖枚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廷臼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓盅惜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親忌穿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抒寂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344