Node.js 服務(wù)器
接收請(qǐng)求
- 新建一個(gè)安全的目錄轨帜。
cd ~/Desktop; mkdir node-demo; cd node-demo
touch server.js
- 編輯 server.js蚌父,GitHub毛萌。
- 運(yùn)行 node server 或者 node server.js,看到報(bào)錯(cuò)
- 根據(jù)報(bào)錯(cuò)提示調(diào)整你的命令
- 成功之后阁将,這個(gè) server 會(huì)保持運(yùn)行,無(wú)法退出
- 如果你想「中斷」這個(gè) server缤削,按 <kb>Ctrl</kbd> + <kbd>C</kbd> 即可
- 中斷后你才能輸入其他命令
- 我建議你把這個(gè) server 放在那里別動(dòng)言蛇,新開(kāi)一個(gè) Bash 窗口,完成下面的教程
好了服務(wù)器完成吨拗。只不過(guò)
- 這個(gè)服務(wù)器目前只有一個(gè)功能婿斥,那就是打印出路徑和查詢(xún)字符串
- 還缺少一個(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 打印出了路徑:
圖片
- 這說(shuō)明我們的 server 收到了我們用 curl 發(fā)出的請(qǐng)求
- 由于 server 遲遲沒(méi)有發(fā)出響應(yīng),所以 curl 就一直等在那里遍希,無(wú)法退出(用 <kb>Ctrl</kbd> + <kbd>C</kbd> 中斷)
發(fā)出響應(yīng)
接下來(lái)我們讓我們 server 發(fā)出響應(yīng)
- 編輯 server.js
- 在中間我標(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é)尾别厘。
- 好了拥诡,響應(yīng)添加成功
- 使用 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);