Node.js從白癡到入門(二):nodejs基礎(chǔ)

注:需要有html和js的基礎(chǔ)

Hello world

首先销凑,我們來(lái)看一下之前的Hello world

var http = require("http");                            // 引入http模塊

http.createServer( function(req,rsp) {                 // 創(chuàng)建http服務(wù)
    rsp.writeHead(200,{'Content-Type': 'text/plain'}); // 添加響應(yīng)頭
    rsp.end('Hello World\n');                          // 結(jié)束響應(yīng)
}).listen(80);                                         // 監(jiān)聽(tīng)80端口

console.log("Server started");                         // 打印消息到控制臺(tái)

這是一個(gè)最基礎(chǔ)的,對(duì)所有的請(qǐng)求都返回“Hello World”少态,開(kāi)頭引入http模塊叛复,使用http對(duì)象創(chuàng)建一個(gè)http服務(wù)并監(jiān)聽(tīng)80端口,回調(diào)函數(shù)中有一個(gè)req和rsp表示客戶端瀏覽器的請(qǐng)求(request)和服務(wù)端的響應(yīng)(response)鄙皇,我們只需要將要響應(yīng)的數(shù)據(jù)放到rsp里面即可,使用end()方法結(jié)束鼻吮。

如何顯示一個(gè)html頁(yè)面

我們知道育苟,最基礎(chǔ)的靜態(tài)網(wǎng)站是將我們寫好的html文件發(fā)送給瀏覽器顯示,那么如何使用nodejs顯示html文件椎木?
我們?cè)陧?xiàng)目根目錄下創(chuàng)建一個(gè)index.html

<!DOCTYPE html>
<html>
<head>
    <title>這是主頁(yè)</title>
</head>
<body>
    < img src="tupian.jpg" >
</body>
</html>

在根目錄放置一張圖片tupian.jpg违柏。
根據(jù)前面的知識(shí)我們能猜到,我們只要將html文件讀出來(lái)寫入到res里面即可香椎,那么讀寫文件我們就需要引入fs模塊漱竖,代碼修改如下:

var http = require("http");
var fs = require("fs");

http.createServer( function(req,rsp) {
    fs.readFile("index.html",function(err,data){  // 讀取文件
        rsp.end(data.toString());                 // 文件數(shù)據(jù)轉(zhuǎn)成字符串后寫入rsp
    });
}).listen(80);

console.log("Server started");

項(xiàng)目根目錄下重新啟動(dòng)node(控制臺(tái)Ctrl+c退出,重新node test.js)畜伐,訪問(wèn)http://www.localhost/后會(huì)發(fā)現(xiàn)如下頁(yè)面:


這里我們可以發(fā)現(xiàn)頁(yè)面是已經(jīng)加載出來(lái)了馍惹,但圖片卻無(wú)法顯示,但是我們直接用瀏覽器打開(kāi)index.html卻正常玛界,并且我們?cè)谟蛎竺婕尤魏螙|西都能顯示這個(gè)頁(yè)面万矾,這是為何?

頂層路由

我們?cè)趆ttp回調(diào)的時(shí)候添加打印req.url

var http = require("http");
var fs = require("fs");

http.createServer( function(req,rsp) {
    console.log(req.url);
    fs.readFile("index.html",function(err,data){
        rsp.end(data.toString());
    });
}).listen(80);

console.log("Server started");

刷新頁(yè)面后發(fā)現(xiàn)我們刷新一次卻響應(yīng)了三次:


從字面上看“/”應(yīng)該響應(yīng)我們的html頁(yè)面慎框;“/tupian.jpg”是我們html文件中的img標(biāo)簽發(fā)起的請(qǐng)求良狈,應(yīng)該響應(yīng)我們圖片資源,然而我們這里依然響應(yīng)了index.html這個(gè)頁(yè)面顯然是不對(duì)的笨枯;“/favicon.ico”是請(qǐng)求圖標(biāo)的薪丁,這里暫不關(guān)心。
既然這樣馅精,那我們是不是能通過(guò)url來(lái)分別響應(yīng)對(duì)應(yīng)的數(shù)據(jù)严嗜?
我們繼續(xù)修改代碼,添加一個(gè)switch來(lái)分別對(duì)相應(yīng)的請(qǐng)求做出對(duì)應(yīng)的響應(yīng):

var http = require("http");
var fs = require("fs");

http.createServer( function(req,rsp) {
    console.log(req.url);
    switch(req.url){
        case "/":
            rsp.setHeader("Content-Type","text/html;charset=UTF-8"); // 設(shè)置內(nèi)容類型為html洲敢,字符集為UTF-8
            fs.readFile("index.html",function(err,data){
                rsp.end(data.toString());
            });
            break;
        case "/tupian.jpg":
            rsp.setHeader("Content-Type","image/jpeg");              // 設(shè)置內(nèi)容類型為image/jpeg格式
            fs.readFile("tupian.jpg",function(err,data){
                rsp.end(data);
            });
            break;
        default:
            rsp.writeHead(200,{'Content-Type': 'text/plain'});
            rsp.end("404");
            break;
    }
}).listen(80);

console.log("Server started");

重新啟動(dòng)后刷新頁(yè)面(每次修改js文件后都必須重新啟動(dòng)):


顯示已經(jīng)正常了漫玄,并且訪問(wèn)其它地址會(huì)返回404,這基礎(chǔ)的路由就已經(jīng)實(shí)現(xiàn)了压彭。

http請(qǐng)求

http請(qǐng)求分get和post兩種方式称近,這兩種都是上行請(qǐng)求,都是將數(shù)據(jù)從瀏覽器發(fā)送到服務(wù)器哮塞,只是攜帶參數(shù)的方式不一樣刨秆。get請(qǐng)求是將參數(shù)放在url里面(網(wǎng)址中‘?’之后的數(shù)據(jù)),post是將數(shù)據(jù)放在表單里面忆畅。get方式比較輕便衡未,post方式比較安全,可以上傳大數(shù)據(jù)塊家凯,比如說(shuō)上傳文件缓醋。

get請(qǐng)求

get請(qǐng)求的參數(shù)的獲得需要用url模塊解析url得到querystring,即可得到绊诲。我們?cè)傩陆ㄒ粋€(gè)“/get”路由送粱,用來(lái)接收get請(qǐng)求。

var url = require("url");                           // 引入url模塊
...
switch(url.parse(req.url).pathname){                // 解析出url路徑(此時(shí)url帶了參數(shù)需要去除)
    ...
    case "/get":
        var query = url.parse(req.url,true).query;  // 解析出querystring
        //console.log(query);
        rsp.writeHead(200,{'Content-Type': 'text/plain'});
        rsp.end("名字:"+query.name+"\n年齡:"+query.age);
        break;
    ...
}
...

然后我們?cè)L問(wèn)http://www.localhost/get?name=xiaoming&age=19就能得到以下結(jié)果:

post請(qǐng)求

由于nodejs的單線程的掂之,所以一但有大內(nèi)容持續(xù)傳輸將嚴(yán)重影響體驗(yàn)抗俄,但nodejs會(huì)將post請(qǐng)求進(jìn)行分包脆丁,每次只傳一點(diǎn)點(diǎn),以免阻塞其它用戶动雹。post請(qǐng)求是可以跨域(不同的網(wǎng)站)請(qǐng)求的槽卫,我們這里創(chuàng)建一個(gè)post.html存放一個(gè)表單,提交到http://www.localhost/post去胰蝠。在代碼中創(chuàng)建一個(gè)“/post”路由來(lái)接收post請(qǐng)求歼培。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>post請(qǐng)求</title>
</head>
<body>
    <form action="http://www.localhost/post" method="post">
        <input type="text" name="name"><br><br>
        <input type="text" name="age"><br><br>
        <input type="submit">
    </form>
</body>
</html>

修改js文件

...
case "/post":
    var ret = "";
    req.on("data",function(chunk){                   // 小包接收
        ret += chunk;
    });
    req.on("end",function(chunk){                    // 全部接收完畢
        var obj = querystring.parse(ret.toString()); // querystring轉(zhuǎn)成對(duì)象
        console.log(obj);
        rsp.writeHead(200,{'Content-Type': 'text/plain'});
        rsp.end("名字:"+obj.name+"\n年齡:"+obj.age);
    });
    break;
...

填寫表單

提交

源碼

點(diǎn)雞下崽

nodejs的特性

1、nodejs是單線程的
nodejs的主流程只有一個(gè)線程在執(zhí)行茸塞,所以nodejs不適合做計(jì)算量大的項(xiàng)目躲庄,所有的耗時(shí)操作都是通過(guò)回調(diào)來(lái)實(shí)現(xiàn)的。也正因?yàn)槭菃尉€程的钾虐,所以占用資源相當(dāng)少噪窘。
但不是說(shuō)需要一個(gè)頁(yè)面響應(yīng)完后nodejs再響應(yīng)其它的,nodejs在每個(gè)回調(diào)的點(diǎn)都會(huì)切換執(zhí)行的事件禾唁,也就是說(shuō)如果請(qǐng)求不是特別頻繁的情況下用戶是沒(méi)有感覺(jué)的效览。但一但有一個(gè)用戶頁(yè)面奔潰了整個(gè)服務(wù)器就宕了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荡短,一起剝皮案震驚了整個(gè)濱河市丐枉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掘托,老刑警劉巖瘦锹,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異闪盔,居然都是意外死亡弯院,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門泪掀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)听绳,“玉大人,你說(shuō)我怎么就攤上這事异赫∫握酰” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵塔拳,是天一觀的道長(zhǎng)鼠证。 經(jīng)常有香客問(wèn)我,道長(zhǎng)靠抑,這世上最難降的妖魔是什么量九? 我笑而不...
    開(kāi)封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上荠列,老公的妹妹穿的比我還像新娘类浪。我一直安慰自己,他們只是感情好弯予,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布戚宦。 她就那樣靜靜地躺著个曙,像睡著了一般锈嫩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垦搬,一...
    開(kāi)封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天呼寸,我揣著相機(jī)與錄音,去河邊找鬼猴贰。 笑死对雪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的米绕。 我是一名探鬼主播瑟捣,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼栅干!你這毒婦竟也來(lái)了迈套?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碱鳞,失蹤者是張志新(化名)和其女友劉穎桑李,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體窿给,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贵白,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了崩泡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禁荒。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖角撞,靈堂內(nèi)的尸體忽然破棺而出呛伴,到底是詐尸還是另有隱情,我是刑警寧澤靴寂,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布磷蜀,位于F島的核電站,受9級(jí)特大地震影響百炬,放射性物質(zhì)發(fā)生泄漏褐隆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一剖踊、第九天 我趴在偏房一處隱蔽的房頂上張望庶弃。 院中可真熱鬧衫贬,春花似錦、人聲如沸歇攻。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缴守。三九已至葬毫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屡穗,已是汗流浹背贴捡。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留村砂,地道東北人烂斋。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像础废,于是被迫代替她去往敵國(guó)和親汛骂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理评腺,服務(wù)發(fā)現(xiàn)帘瞭,斷路器,智...
    卡卡羅2017閱讀 134,665評(píng)論 18 139
  • Http協(xié)議詳解 標(biāo)簽(空格分隔): Linux 聲明:本片文章非原創(chuàng)歇僧,內(nèi)容來(lái)源于博客園作者M(jìn)IN飛翔的HTTP協(xié)...
    Sivin閱讀 5,224評(píng)論 3 82
  • 一图张、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,359評(píng)論 6 152
  • 秋接近尾聲樹(shù)上的葉子掉得精光落在街道水溝底像一塊薄薄的藥棉貼在發(fā)炎的土地上折斷的肋骨呻吟準(zhǔn)備著一次漫無(wú)目的的療傷(...
    君涼閱讀 282評(píng)論 4 43
  • 每到年初,很多人都會(huì)制定自己的新年計(jì)劃诈悍,許下無(wú)數(shù)雄心壯志祸轮。有要減肥N斤的,有要跑馬拉松的侥钳,有要讀200本書的适袜,有要...
    作家格格閱讀 237評(píng)論 0 4