HTTP(三): 一個(gè)簡(jiǎn)易的server

Node.js 服務(wù)器

接收請(qǐng)求

  1. 新建一個(gè)安全的目錄轨帜。
    cd ~/Desktop; mkdir node-demo; cd node-demo
  2. touch server.js
  3. 編輯 server.js蚌父,GitHub毛萌。
  4. 運(yùn)行 node server 或者 node server.js,看到報(bào)錯(cuò)
  5. 根據(jù)報(bào)錯(cuò)提示調(diào)整你的命令
  6. 成功之后阁将,這個(gè) server 會(huì)保持運(yùn)行,無(wú)法退出
    • 如果你想「中斷」這個(gè) server缤削,按 <kb>Ctrl</kbd> + <kbd>C</kbd> 即可
    • 中斷后你才能輸入其他命令
    • 我建議你把這個(gè) server 放在那里別動(dòng)言蛇,新開(kāi)一個(gè) Bash 窗口,完成下面的教程

好了服務(wù)器完成吨拗。只不過(guò)

  1. 這個(gè)服務(wù)器目前只有一個(gè)功能婿斥,那就是打印出路徑和查詢(xún)字符串
  2. 還缺少一個(gè)重要的功能,那就是發(fā)出 HTTP 響應(yīng)

目前我們先只做一個(gè)功能娇妓。

接下來(lái)你要發(fā)起一個(gè)請(qǐng)求到這個(gè)服務(wù)器活鹰。這聽(tīng)起來(lái)有點(diǎn)怪異只估,「我向自己發(fā)起請(qǐng)求」着绷,目前是的,因?yàn)槟阗I(mǎi)不起服務(wù)器啊吁脱。

在新的 Bash 窗口運(yùn)行 curl http://localhost:你的指定的端口/xxx 或者 curl http://127.0.0.1:你指定的端口/xxx彬向。

你會(huì)馬上發(fā)現(xiàn) server 打印出了路徑:

圖片
  1. 這說(shuō)明我們的 server 收到了我們用 curl 發(fā)出的請(qǐng)求
  2. 由于 server 遲遲沒(méi)有發(fā)出響應(yīng),所以 curl 就一直等在那里遍希,無(wú)法退出(用 <kb>Ctrl</kbd> + <kbd>C</kbd> 中斷)
發(fā)出響應(yīng)

接下來(lái)我們讓我們 server 發(fā)出響應(yīng)

  1. 編輯 server.js
  2. 在中間我標(biāo)注的區(qū)域添加兩行代碼
 response.write('Hi')
 response.end()

3.中斷之前的 server里烦,重新運(yùn)行 node server 8888
4.curl http://127.0.0.1:8888/xxx,結(jié)果如下:

Hi%

這個(gè) % 不是我們的內(nèi)容,% 表示結(jié)尾别厘。

  1. 好了拥诡,響應(yīng)添加成功
  2. 使用 curl -s -v -- "http://localhost:8888/xxx" 可以查看完整的請(qǐng)求和響應(yīng)
根據(jù)請(qǐng)求返回不同的響應(yīng)
  • 響應(yīng) /
  • 響應(yīng) /xxx
  • 響應(yīng) 404
  • 響應(yīng) /xxx.html
  • 響應(yīng) /xxx.frank
  • 再次強(qiáng)調(diào),后綴是廢話(huà)冗懦。文件內(nèi)容是有 HTTP 頭中的 Content-Type 保證的
  • 響應(yīng) /xxx.css
  • 響應(yīng) /xxx.js
  • HTTP 路徑不是文件路徑3鸺馈!乌奇!/xxx.html 不一定對(duì)應(yīng) xxx.html 文件
完整的代碼
var http = require('http')
var fs = require('fs')
var url = require('url')
var port = process.argv[2]

if(!port){
  console.log('請(qǐng)指定端口號(hào)好不啦?\nnode server.js 8888 這樣不會(huì)嗎爬凑?')
  process.exit(1)
}

var server = http.createServer(function(request, response){
  var parsedUrl = url.parse(request.url, true)
  var path = request.url 
  var query = ''
  if(path.indexOf('?') >= 0){ query = path.substring(path.indexOf('?')) }
  var pathNoQuery = parsedUrl.pathname
  var queryObject = parsedUrl.query
  var method = request.method

  /******** 從這里開(kāi)始看试伙,上面不要看 ************/

  console.log('HTTP 路徑為\n' + path)
  if(path == '/style.js'){
    response.setHeader('Content-Type', 'text/css; charset=utf-8')
    response.write('body{background-color: #ddd;}h1{color: red;}')
    response.end()
  }else if(path == '/script.html'){
    response.setHeader('Content-Type', 'text/javascript; charset=utf-8')
    response.write('alert("這是JS執(zhí)行的")')
    response.end()
  }else if(path == '/index.css'){
    response.setHeader('Content-Type', 'text/html; charset=utf-8')
    response.write('<!DOCTYPE>\n<html>'  + 
      '<head><link rel="stylesheet" href="/style.js">' +
      '</head><body>'  +
      '<h1>你好</h1>' +
      '<script src="/script.html"></script>' +
      '</body></html>')
    response.end()
  }else{
    response.statusCode = 404
    response.end()
  }

  /******** 代碼結(jié)束,下面不要看 ************/
})

server.listen(port)
console.log('監(jiān)聽(tīng) ' + port + ' 成功\n請(qǐng)用在空中轉(zhuǎn)體720度然后用電飯煲打開(kāi) http://localhost:' + port)
在node里引入另一個(gè)文件的時(shí)候的兩種寫(xiě)法:

1.直接在response.write()內(nèi)寫(xiě)入文件的內(nèi)容(注意這種寫(xiě)法必須聲明響應(yīng)頭類(lèi)型)

//聲明響應(yīng)頭讓頁(yè)面知道這是一個(gè)css類(lèi)型文件
response.setHeader('Content-Type','text/css; charset=utf-8')
response.write('body{background-color:gray;}h1{color:red;}')

2.通過(guò)fs.readFileSync('路徑','utf8')穿剖,直接引入一個(gè)文件

var string = fs.readFileSync('./index.html','utf8');
response.write(string);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末携御,一起剝皮案震驚了整個(gè)濱河市既绕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凄贩,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昵时,死亡現(xiàn)場(chǎng)離奇詭異椒丧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)句柠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén)棒假,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人谜酒,你說(shuō)我怎么就攤上這事妻枕。” “怎么了鹰贵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵康嘉,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我敷钾,道長(zhǎng),這世上最難降的妖魔是什么阻荒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任侨赡,我火速辦了婚禮,結(jié)果婚禮上羊壹,老公的妹妹穿的比我還像新娘。我一直安慰自己稠茂,他們只是感情好情妖,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著电爹,像睡著了一般料睛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,874評(píng)論 1 314
  • 那天涎嚼,我揣著相機(jī)與錄音,去河邊找鬼法梯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛夜惭,可吹牛的內(nèi)容都是我干的铛绰。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼敢会,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鸥昏?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤障涯,失蹤者是張志新(化名)和其女友劉穎膳汪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體生棍,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡媳谁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年晴音,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锤躁。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡系羞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出椒振,到底是詐尸還是另有隱情,我是刑警寧澤庐杨,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布夹供,位于F島的核電站,受9級(jí)特大地震影響填渠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜揭蜒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一屉更、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瑰谜,春花似錦、人聲如沸隐轩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)悴灵。三九已至骂蓖,卻和暖如春积瞒,著一層夾襖步出監(jiān)牢的瞬間登下,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工缰贝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畔濒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像壹将,于是被迫代替她去往敵國(guó)和親毛嫉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

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