Node.js 的 http 模塊

實(shí)驗(yàn)簡(jiǎn)介

http模塊主要用于創(chuàng)建http server服務(wù)拨拓,此次實(shí)驗(yàn)還會(huì)講到url模塊和path模塊瘩燥,同時(shí)也會(huì)用到前面講過(guò)的fs模塊轧粟。url模塊用于解析url暂雹,path模塊用于處理和轉(zhuǎn)換文件路徑茫陆。

 通過(guò)前面的實(shí)驗(yàn),相信大家對(duì)Node.js模塊的使用已經(jīng)比較熟悉擎析。在這個(gè)實(shí)驗(yàn)中簿盅,我們就通過(guò)編寫一個(gè)簡(jiǎn)單的http server來(lái)學(xué)習(xí)http模塊。

一揍魂、創(chuàng)建http server

通過(guò)Node.js創(chuàng)建http server非常簡(jiǎn)單桨醋,示例代碼如下:
<pre>
/ 引入http模塊
var http = require('http');
// 創(chuàng)建http server
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
</pre>
運(yùn)行此文件:<pre>$ node demo.js</pre>
然后打開虛擬機(jī)瀏覽器,訪問(wèn)http://127.0.0.1:1337/现斋,
就會(huì)看到頁(yè)面上顯示了Hello World喜最,說(shuō)明我們的http server創(chuàng)建成功了。

當(dāng)然庄蹋,我們?cè)谶@個(gè)實(shí)驗(yàn)要做的比這個(gè)稍微復(fù)雜一點(diǎn)瞬内。
在這個(gè)實(shí)驗(yàn)中,我們會(huì)創(chuàng)建一個(gè)簡(jiǎn)單的http server限书,所有的代碼都放在app這個(gè)文件夾中虫蝶。首先,新建一個(gè)文app件夾倦西,在文件夾中新建server.js
文件能真,輸入如下代碼(其中的注釋為代碼解釋):

<pre>
// 創(chuàng)建http server
//
// 加載所需模塊
var http = require('http');
var url = require('url');
var fs = require('fs');
// 設(shè)置ip和端口
// 實(shí)際應(yīng)用中,可以把這些寫到配置文件中
var host = '127.0.0.1',
port = 8080;
// 創(chuàng)建http server
function start(route, handle) {
// 參數(shù)
// route 判斷url是否存在,存在則調(diào)用handle處理粉铐,不存在則返回404
// handle 處理不同的url請(qǐng)求
// 處理request請(qǐng)求
function onRequest(req, res) {
// 使用url.parse()方法解析url
// 它會(huì)把url string轉(zhuǎn)化為一個(gè)object
// 這樣我們就可以很方便的獲取url中的host疼约、port、pathname等值了
var pathname = url.parse(req.url).pathname;
console.log('Request for ' + pathname + ' received.');
// 判斷并處理不同url請(qǐng)求
// 后面介紹此方法
route(handle, pathname, res, req);
}
// 使用http.createSserver()方法創(chuàng)建http server
// 并傳入onRequest()方法
// 然后使用listen()方法監(jiān)聽指定地址
http.createServer(onRequest).listen(port, host);
console.log('Server has started and listening on ' + host + ':' + port);
}
// 導(dǎo)出 start 方法
exports.start = start;
</pre>
在文件的最后蝙泼,我們導(dǎo)出了start方法程剥,以便在主程序中使用。你肯定注意到了汤踏,在代碼中使用了route()方法织鲸,它用于處理判斷請(qǐng)求的url是否存在,現(xiàn)在我們就來(lái)編寫這個(gè)方法茎活。

二、創(chuàng)建路由

在app文件夾中新建router.js琢唾,輸入如下代碼:
<pre>
var fs = require('fs');
// 路由函數(shù)
// 處理不同url的請(qǐng)求
// 并返回相應(yīng)內(nèi)容
function route(handle, pathname, res, req) {
console.log('About to route a request for ' + pathname);
// 判斷此url是否存在特定處理函數(shù)
// 存在則調(diào)用handle處理
// 不存在則返回404頁(yè)面
if (typeof handle[pathname] === 'function') {
// 后面介紹handle函數(shù)
handle[pathname](res, req);
} else {
console.log('No request handler found for ' + pathname);
// 讀取404頁(yè)面
// 所有頁(yè)面都存放在view文件夾下
var content = fs.readFileSync('./views/404.html');
res.writeHead(404, { 'Content-Type': 'text/html' });
res.write(content);
res.end();
}
}
// 導(dǎo)出 route 方法
exports.route = route;
</pre>
在此方法中载荔,調(diào)用了handle()方法,這個(gè)方法用于處理不同的url請(qǐng)求采桃。
在app文件夾中新建requestHandlers.js文件懒熙,輸入如下代碼:
<pre>
// 處理url請(qǐng)求
var fs = require('fs');
// home.html 主頁(yè)
function home(res) {
console.log('Request handler "home" was called.');
// 讀取home.html文件
var content = fs.readFileSync('./views/home.html');
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write(content);
res.end();
}
// about.html 關(guān)于頁(yè)面
function about(res) {
console.log('Request handler "about" was called.');
// 讀取about.html文件
var content = fs.readFileSync('./views/about.html');
res.write(200, { 'Content-Type': 'text/html' });
res.write(content);
res.end();
}
// 導(dǎo)出頁(yè)面處理函數(shù)
exports.home = home;
exports.about = about;
</pre>
這個(gè)方法比較簡(jiǎn)單,就是讀取文件普办,然后輸出到response工扎。

三、創(chuàng)建主程序

創(chuàng)建http server衔蹲,判斷url肢娘,處理url都寫完了,那么我們可以寫主程序來(lái)運(yùn)行http server了舆驶,在app文件夾新建main.js文件橱健,輸入如下代碼:
<pre>
// 主程序
// 引入server,router及requestHandler
var server = require('./server');
var router = require('./router');
var requestHandlers = require('./requestHandlers');
// 保存url處理方法
var handle = {};
handle['/'] = requestHandlers.home;
handle['/about'] = requestHandlers.about;
// 啟動(dòng)http server
server.start(router.route, handle);
</pre>
到此沙廉,所有的服務(wù)器代碼都寫完了拘荡,那么我們來(lái)添加代碼中用到的兩個(gè)html文件吧。

四撬陵、創(chuàng)建HTML文件

在app文件夾中新建views文件夾珊皿,在views文件夾中,新建home.html文件巨税、about.html文件和404.html文件蟋定。
文件中的代碼如下所示:
home.html文件:
<pre>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Home page</title>
</head>
<body>
<p>home page</p>
</body>
</html>
</pre>
about.html文件:

<!DOCTYPE html>
<pre>
<html>
<head>
<meta charset="utf-8">
<title>About page</title>
</head>
<body>
<p>about page</p>
</body>
</html>
</pre>
404.html文件:
<pre>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>404 page</title>
</head>
<body>
<p>404 page not found</p>
</body>
</html>
</pre>
HTML文件的代碼寫得比較簡(jiǎn)單,可自由發(fā)揮草添。

那么現(xiàn)在我們來(lái)運(yùn)行程序吧:
<pre>$ node main.js</pre>
運(yùn)行成功后溢吻,打開虛擬機(jī)桌面的瀏覽器,
訪問(wèn)“http://127.0.0.1:8080” ==>就會(huì)看到頁(yè)面顯示“home page”,
訪問(wèn)“http://127.0.0.1:8080/about” ==>就會(huì)看到頁(yè)面顯示“about page”促王,
訪問(wèn)http://127.0.0.1:8080 ==>下的其他頁(yè)面就會(huì)看到頁(yè)面顯示404 page not found犀盟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蝇狼,隨后出現(xiàn)的幾起案子阅畴,更是在濱河造成了極大的恐慌,老刑警劉巖迅耘,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贱枣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡颤专,警方通過(guò)查閱死者的電腦和手機(jī)纽哥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)栖秕,“玉大人春塌,你說(shuō)我怎么就攤上這事〈睾矗” “怎么了只壳?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)暑塑。 經(jīng)常有香客問(wèn)我吼句,道長(zhǎng),這世上最難降的妖魔是什么事格? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任惕艳,我火速辦了婚禮,結(jié)果婚禮上驹愚,老公的妹妹穿的比我還像新娘尔艇。我一直安慰自己,他們只是感情好么鹤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布终娃。 她就那樣靜靜地躺著,像睡著了一般蒸甜。 火紅的嫁衣襯著肌膚如雪棠耕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天柠新,我揣著相機(jī)與錄音窍荧,去河邊找鬼。 笑死恨憎,一個(gè)胖子當(dāng)著我的面吹牛蕊退,可吹牛的內(nèi)容都是我干的郊楣。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼瓤荔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼净蚤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起输硝,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤今瀑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后点把,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橘荠,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年郎逃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哥童。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡褒翰,死狀恐怖贮懈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情影暴,我是刑警寧澤错邦,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布探赫,位于F島的核電站型宙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伦吠。R本人自食惡果不足惜妆兑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毛仪。 院中可真熱鬧搁嗓,春花似錦、人聲如沸箱靴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衡怀。三九已至棍矛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抛杨,已是汗流浹背够委。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怖现,地道東北人茁帽。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親潘拨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吊输,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)战秋,斷路器璧亚,智...
    卡卡羅2017閱讀 134,711評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,307評(píng)論 25 707
  • 1 Node.js模塊的實(shí)現(xiàn) 之前在網(wǎng)上查閱了許多介紹Node.js的文章,可惜對(duì)于Node.js的模塊機(jī)制大都著...
    zlx_2017閱讀 1,249評(píng)論 0 1
  • 最近在學(xué)習(xí) Webpack,網(wǎng)上大多數(shù)入門教程都是基于 Webpack 1.x 版本的,我學(xué)習(xí) Webpack 的...
    My_Oh_My閱讀 8,190評(píng)論 40 247
  • 晚上一個(gè)人在聽音樂(lè)寫明信片時(shí)癣蟋,舍友從外面回來(lái)了,知道她按慣例要跳減肥操狰闪,我關(guān)了正在外放的歌疯搅,誰(shuí)知她突然開口來(lái)了一句...
    黑白鬼閱讀 763評(píng)論 5 6