Node.js之http模塊的用法
前言
Node.js開發(fā)的目的就是為了用JavaScript編寫Web服務(wù)器程序。因?yàn)镴avaScript實(shí)際上已經(jīng)統(tǒng)治了瀏覽器端的腳本,其優(yōu)勢就是有世界上數(shù)量最多的前端開發(fā)人員。如果已經(jīng)掌握了JavaScript前端開發(fā),再學(xué)習(xí)一下如何將JavaScript應(yīng)用在后端開發(fā),就是名副其實(shí)的全棧了。
HTTP協(xié)議
要理解Web服務(wù)器程序的工作原理,首先,我們要對HTTP協(xié)議有基本的了解。如果你對HTTP協(xié)議不太熟悉,先看一看HTTP協(xié)議簡介。
HTTP服務(wù)器
要開發(fā)HTTP服務(wù)器程序,從頭處理TCP連接,解析HTTP是不現(xiàn)實(shí)的。這些工作實(shí)際上已經(jīng)由Node.js自帶的http模塊完成了。應(yīng)用程序并不直接和HTTP協(xié)議打交道,而是操作http模塊提供的request和response對象。
request對象封裝了HTTP請求,我們調(diào)用request對象的屬性和方法就可以拿到所有HTTP請求的信息;
response對象封裝了HTTP響應(yīng),我們操作response對象的方法,就可以把HTTP響應(yīng)返回給瀏覽器。
用Node.js實(shí)現(xiàn)一個(gè)HTTP服務(wù)器程序非常簡單。我們來實(shí)現(xiàn)一個(gè)最簡單的Web程序hello.js,它對于所有請求,都返回Hello world!:
'use strict'; var http = require('http');// 導(dǎo)入http模塊 // 創(chuàng)建http server,并傳入回調(diào)函數(shù)?;卣{(diào)函數(shù)接收request和response對象 var server = http.createServer(function (request, response){ console.log(request.method + ': ' + request.url);// 獲得HTTP請求的method和url: response.writeHead(200, {'Content-Type': 'text/html'});// 將HTTP響應(yīng)200寫入response, 同時(shí)設(shè)置Content-Type: text/html response.end('<h1>Hello world!</h1>'); });// 將HTTP響應(yīng)的HTML內(nèi)容寫入response server.listen(8080); // 讓服務(wù)器監(jiān)聽8080端口 console.log('Server is running at http://127.0.0.1:8080/');
在命令提示符下運(yùn)行該程序,可以看到以下輸出:
$ node hello.js Server is running at http://127.0.0.1:8080/
不要關(guān)閉命令提示符,直接打開瀏覽器輸入http://localhost:8080,即可看到服務(wù)器響應(yīng)的內(nèi)容:
同時(shí),在命令提示符窗口,可以看到程序打印的請求信息:
GET: /
GET: /favicon.ico
這就是我們編寫的第一個(gè)HTTP服務(wù)器程序!
文件服務(wù)器
讓我們繼續(xù)擴(kuò)展一下上面的Web程序。我們可以設(shè)定一個(gè)目錄,然后讓W(xué)eb程序變成一個(gè)文件服務(wù)器。要實(shí)現(xiàn)這一點(diǎn),我們只需要解析request.url中的路徑,然后在本地找到對應(yīng)的文件,把文件內(nèi)容發(fā)送出去就可以了。
解析URL需要用到Node.js提供的url模塊,它使用起來非常簡單,通過parse()將一個(gè)字符串解析為一個(gè)Url對象:
'use strict'; var url = require('url'); console.log(url.parse('http://user:pass@host.com:8080/path/to/file?query=string#hash'));
結(jié)果如下:
Url { protocol: 'http:', slashes: true, auth: 'user:pass', host: 'host.com:8080', port: '8080', hostname: 'host.com', hash: '#hash', search: '?query=string', query: 'query=string', pathname: '/path/to/file', path: '/path/to/file?query=string', href: 'http://user:pass@host.com:8080/path/to/file?query=string#hash' }
處理本地文件目錄需要使用Node.js提供的path模塊,它可以方便地構(gòu)造目錄:
'use strict'; var path = require('path'); var workDir = path.resolve('.');// 解析當(dāng)前目錄('/Users/michael') var filePath = path.join(workDir, 'pub', 'index.html');// 組合完整的文件路徑:當(dāng)前目錄+'pub'+'index.html'('/Users/michael/pub/index.html')
使用path模塊可以正確處理操作系統(tǒng)相關(guān)的文件路徑。在Windows系統(tǒng)下,返回的路徑類似于C:\Users\michael\static\index.html,這樣,我們就不關(guān)心怎么拼接路徑了。
最后,我們實(shí)現(xiàn)一個(gè)文件服務(wù)器file_server.js:
'use strict'; var fs = require('fs'),url = require('url'),path = require('path'),http = require('http'); var root = path.resolve(process.argv[2] || '.');// 從命令行參數(shù)獲取root目錄,默認(rèn)是當(dāng)前目錄 console.log('Static root dir: ' + root); var server = http.createServer(function (request, response){// 創(chuàng)建服務(wù)器 var pathname = url.parse(request.url).pathname;// 獲得URL的path,類似 '/css/bootstrap.css' var filepath = path.join(root, pathname);// 獲得對應(yīng)的本地文件路徑,類似 '/srv/www/css/bootstrap.css' fs.stat(filepath, function (err, stats) {if (!err && stats.isFile()) {// 獲取文件狀態(tài) console.log('200 ' + request.url);// 沒有出錯并且文件存在 response.writeHead(200);// 發(fā)送200響應(yīng) // 將文件流導(dǎo)向response: fs.createReadStream(filepath).pipe(response); } else { console.log('404 ' + request.url);// 出錯了或者文件不存在 response.writeHead(404); response.end('404 Not Found'); } }); }); // 發(fā)送404響應(yīng) server.listen(8080); console.log('Server is running at http://127.0.0.1:8080/');
沒有必要手動讀取文件內(nèi)容。由于response對象本身是一個(gè)Writable Stream,直接用pipe()方法就實(shí)現(xiàn)了自動讀取文件內(nèi)容并輸出到HTTP響應(yīng)。
在命令行運(yùn)行node file_server.js /path/to/dir,把/path/to/dir改成你本地的一個(gè)有效的目錄,然后在瀏覽器中輸入http://localhost:8080/index.html:
只要當(dāng)前目錄下存在文件index.html,服務(wù)器就可以把文件內(nèi)容發(fā)送給瀏覽器。觀察控制臺輸出:
200 /index.html
200 /css/uikit.min.css
200 /js/jquery.min.js
200 /fonts/fontawesome-webfont.woff2
第一個(gè)請求是瀏覽器請求index.html頁面,后續(xù)請求是瀏覽器解析HTML后發(fā)送的其它資源請求。
練習(xí)
在瀏覽器輸入http://localhost:8080/時(shí),會返回404,原因是程序識別出HTTP請求的不是文件,而是目錄。請修改file_server.js;如果遇到請求的路徑是目錄,則自動在目錄下依次搜索index.html、default.html,如果找到了,就返回HTML文件的內(nèi)容。
參考源碼
http服務(wù)器代碼(含靜態(tài)網(wǎng)站)
https://github.com/michaelliao/learn-javascript/tree/master/samples/node/http
以上就是Node.js之http模塊的用法的詳細(xì)內(nèi)容,更多關(guān)于Node.js的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
node.js中的fs.writeFileSync方法使用說明
這篇文章主要介紹了node.js中的fs.writeFileSync方法使用說明,本文介紹了fs.writeFileSync的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12NodeJs 實(shí)現(xiàn)簡單WebSocket即時(shí)通訊的示例代碼
這篇文章主要介紹了NodeJs 實(shí)現(xiàn)簡單WebSocket即時(shí)通訊的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08基于Express實(shí)現(xiàn)遞歸遍歷文件和CRUD操作
在現(xiàn)代的?Web?應(yīng)用開發(fā)中,文件管理是一個(gè)常見而重要的需求,所以本文就來講講如何利用?Express?框架,在遞歸遍歷文件之后實(shí)現(xiàn)強(qiáng)大的?CRUD?操作,構(gòu)建一個(gè)功能完善的文件管理系統(tǒng),感興趣的可以了解一下2023-06-06nodejs如何獲取當(dāng)前連接的網(wǎng)絡(luò)ip
這篇文章主要介紹了nodejs如何獲取當(dāng)前連接的網(wǎng)絡(luò)ip問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10Node.js fs模塊(文件模塊)創(chuàng)建、刪除目錄(文件)讀取寫入文件流的方法
這篇文章主要介紹了Node.js fs模塊(文件模塊)創(chuàng)建、刪除目錄(文件)讀取寫入文件流的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09Nodejs異步回調(diào)之異常處理實(shí)例分析
這篇文章主要介紹了Nodejs異步回調(diào)之異常處理,結(jié)合實(shí)例形式分析了nodejs基于中間件進(jìn)行異步回調(diào)異常處理過程出現(xiàn)的問題與相應(yīng)的解決方法,需要的朋友可以參考下2018-06-06Node.js中的require.resolve方法使用簡介
在Node.js中,可以使用require.resolve函數(shù)來查詢某個(gè)模塊文件的帶有完整絕對路徑的文件名,下面這篇文章主要介紹了Node.js中require.resolve方法使用的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04