編寫(xiě)一個(gè) HTTP 文件 服務(wù)器,它用于將每次所請(qǐng)求的文件返回給客戶端。
服務(wù)器需要監(jiān)聽(tīng)所提供的第一個(gè)命令行參數(shù)所制定的端口。
同時(shí),第二個(gè)會(huì)提供給程序的參數(shù)則是所需要響應(yīng)的文本文件的位置。在這一題中必須使用fs.createReadStream()
?方法以 stream 的形式作出請(qǐng)求相應(yīng)。
由于我們需要?jiǎng)?chuàng)建的是一個(gè) HTTP 服務(wù)而不是普通的 TCP 服務(wù),因此,應(yīng)該使用 http 這個(gè) Node 核心模塊。它和 net 模塊類似,http 模塊擁有一個(gè)叫做?http.createServer()
?的方法,所不同的是它所創(chuàng)建的服務(wù)器是用 HTTP 協(xié)議進(jìn)行通信的。
http.createServer()
接收一個(gè)回調(diào)函數(shù)作為參數(shù),回調(diào)函數(shù)會(huì)在你的服務(wù)器每一次進(jìn)行連接的時(shí)候執(zhí)行,這個(gè)回調(diào)函數(shù)有以下的特征:
function callback (request, response) { /* ... */ }
在這里,這兩個(gè)參數(shù)是代表一個(gè) HTTP 請(qǐng)求以及相應(yīng)的響應(yīng)的兩個(gè)對(duì)象。request 用來(lái)從請(qǐng)求中獲取一些的屬性,例如請(qǐng)求頭和查詢字符(query-string),而 response 會(huì)發(fā)送數(shù)據(jù)給客戶端,包括響應(yīng)頭部和響應(yīng)主體。
request 和 response 也都是 Node stream!這意味著,如果需要的話,可以使用流式處理(streaming)所抽象的那些方法來(lái)實(shí)現(xiàn)發(fā)送和接收數(shù)據(jù)。
http.createServer()
?會(huì)返回一個(gè) HTTP 服務(wù)器的實(shí)例。這里需要調(diào)用 server.listen(portNumber) 方法去監(jiān)聽(tīng)一個(gè)特定的端口。
一個(gè)典型的 Node HTTP 服務(wù)器將會(huì)是這個(gè)樣子:
var http = require('http')
var server = http.createServer(function (req, res) {
// 處理請(qǐng)求的邏輯...
})
server.listen(8000)
fs 這個(gè)核心模塊也含有一些用來(lái)處理文件的流式(stream) API??梢允褂?fs.createReadStream() 方法來(lái)為命令行參數(shù)指定的文件創(chuàng)建一個(gè) stream。這個(gè)方法會(huì)返回一個(gè) stream 對(duì)象,該對(duì)象可以使用類似 src.pipe(dst) 的語(yǔ)法把數(shù)據(jù)從 src流傳輸(pipe) 到 dst 流中。通過(guò)這種形式,可以輕松地把一個(gè)文件系統(tǒng)的 stream 和一個(gè) HTTP 響應(yīng)的 stream 連接起來(lái)。
var http = require('http')
var fs = require('fs')
var server = http.createServer(function (req, res) {
res.writeHead(200, { 'content-type': 'text/plain' })
fs.createReadStream(process.argv[3]).pipe(res)
})
server.listen(Number(process.argv[2]))
更多建議: